package io.trygvis.ld; import io.trygvis.ld.antlr.GnuLdParser; import io.trygvis.ld.antlr.GnuLdParserBaseVisitor; import org.antlr.v4.runtime.tree.ParseTreeProperty; import java.math.BigInteger; class ElfinfoExprVisitor extends GnuLdParserBaseVisitor { private BigInteger value; private ParseTreeProperty es = new ParseTreeProperty<>(); public static BigInteger evaluate(GnuLdParser.Mustbe_expContext ctx) { ElfinfoExprVisitor v = new ElfinfoExprVisitor(); v.visitMustbe_exp(ctx); return v.value(); } @Override public ElfinfoExprVisitor visitExpLt(GnuLdParser.ExpLtContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpBlock(GnuLdParser.ExpBlockContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAbsolute(GnuLdParser.ExpAbsoluteContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpLog2ceil(GnuLdParser.ExpLog2ceilContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAddr(GnuLdParser.ExpAddrContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpDataSegmentEnd(GnuLdParser.ExpDataSegmentEndContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpSub(GnuLdParser.ExpSubContext ctx) { System.out.println("ElfinfoExprVisitor.visitExpSub"); ElfinfoExprVisitor ret = visitChildren(ctx); BigInteger a = es.removeFrom(ctx.exp(0)); BigInteger b = es.removeFrom(ctx.exp(1)); BigInteger x = a.subtract(b); es.put(ctx, x); return ret; } @Override public ElfinfoExprVisitor visitExpDefined(GnuLdParser.ExpDefinedContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpMod(GnuLdParser.ExpModContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpInvert(GnuLdParser.ExpInvertContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAlign(GnuLdParser.ExpAlignContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpMul(GnuLdParser.ExpMulContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAnd(GnuLdParser.ExpAndContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpXor(GnuLdParser.ExpXorContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpParen(GnuLdParser.ExpParenContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpMinus(GnuLdParser.ExpMinusContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpDiv(GnuLdParser.ExpDivContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpGe(GnuLdParser.ExpGeContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpMin(GnuLdParser.ExpMinContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAlignK(GnuLdParser.ExpAlignKContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpNegate(GnuLdParser.ExpNegateContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpName(GnuLdParser.ExpNameContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpOr(GnuLdParser.ExpOrContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpTrinary(GnuLdParser.ExpTrinaryContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpOror(GnuLdParser.ExpOrorContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpDataSegmentAlign(GnuLdParser.ExpDataSegmentAlignContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpLengthExp(GnuLdParser.ExpLengthExpContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAdd(GnuLdParser.ExpAddContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpLoadaddr(GnuLdParser.ExpLoadaddrContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpGt(GnuLdParser.ExpGtContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpOrigin(GnuLdParser.ExpOriginContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpEq(GnuLdParser.ExpEqContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpMax(GnuLdParser.ExpMaxContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpLshift(GnuLdParser.ExpLshiftContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpSizeofHeaders(GnuLdParser.ExpSizeofHeadersContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpLe(GnuLdParser.ExpLeContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpNe(GnuLdParser.ExpNeContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAndand(GnuLdParser.ExpAndandContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpRshift(GnuLdParser.ExpRshiftContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpNextParen(GnuLdParser.ExpNextParenContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAlignof(GnuLdParser.ExpAlignofContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpSegmentStart(GnuLdParser.ExpSegmentStartContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpInt(GnuLdParser.ExpIntContext ctx) { System.out.println("ElfinfoExprVisitor.visitExpInt"); BigInteger i = parseInt(ctx.INT().getText()); es.put(ctx, i); return this; } public static BigInteger parseInt(String str) { str = str.toLowerCase(); int base = 10; if (str.startsWith("0x")) { base = 16; str = str.substring(2); } int factor = 1; if (str.endsWith("k")) { factor = 1024; str = str.substring(0, str.length() - 1); } else if (str.endsWith("k")) { factor = 1024 * 1024; str = str.substring(0, str.length() - 1); } BigInteger i = new BigInteger(str, base); if (factor > 1) { i = i.multiply(BigInteger.valueOf(factor)); } return i; } @Override public ElfinfoExprVisitor visitExpConstant(GnuLdParser.ExpConstantContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpPlus(GnuLdParser.ExpPlusContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpSizeof(GnuLdParser.ExpSizeofContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpDataSegmentRelRoEnd(GnuLdParser.ExpDataSegmentRelRoEndContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitExpAssert(GnuLdParser.ExpAssertContext ctx) { return visitChildren(ctx); } @Override public ElfinfoExprVisitor visitMustbe_exp(GnuLdParser.Mustbe_expContext ctx) { ElfinfoExprVisitor ret = visitChildren(ctx); value = es.removeFrom(ctx.exp()); es.put(ctx, value); return ret; } public BigInteger value() { if (value != null) { return value; } throw new RuntimeException("Something bad happened, probably an unevaluated expression part."); } }