diff options
Diffstat (limited to 'java/src/main/java/io/trygvis/ld/ElfinfoExprVisitor.java')
-rw-r--r-- | java/src/main/java/io/trygvis/ld/ElfinfoExprVisitor.java | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/java/src/main/java/io/trygvis/ld/ElfinfoExprVisitor.java b/java/src/main/java/io/trygvis/ld/ElfinfoExprVisitor.java new file mode 100644 index 0000000..af5bea5 --- /dev/null +++ b/java/src/main/java/io/trygvis/ld/ElfinfoExprVisitor.java @@ -0,0 +1,318 @@ +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<ElfinfoExprVisitor> { + private BigInteger value; + private ParseTreeProperty<BigInteger> 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."); + } +} |