diff options
Diffstat (limited to 'java/src/main/java/io/trygvis/ld/ElfinfoGnuLdVisitor.java')
-rw-r--r-- | java/src/main/java/io/trygvis/ld/ElfinfoGnuLdVisitor.java | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/java/src/main/java/io/trygvis/ld/ElfinfoGnuLdVisitor.java b/java/src/main/java/io/trygvis/ld/ElfinfoGnuLdVisitor.java new file mode 100644 index 0000000..3062aad --- /dev/null +++ b/java/src/main/java/io/trygvis/ld/ElfinfoGnuLdVisitor.java @@ -0,0 +1,75 @@ +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; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ElfinfoGnuLdVisitor extends GnuLdParserBaseVisitor<ElfinfoGnuLdVisitor> { + public List<LdLoader.MemoryArea> memoryAreas = new ArrayList<>(); + + ParseTreeProperty<BigInteger> es = new ParseTreeProperty<>(); + + @Override + public ElfinfoGnuLdVisitor visitMemory_spec(GnuLdParser.Memory_specContext ctx) { + System.out.println("ElfinfoGnuLdBaseVisitor.visitMemory_spec"); + visitChildren(ctx); + + if (attributesInverted) { + // not quite sure how this is supposed to work yet + throw new RuntimeException("Inverted memory region attributes is not implemented yet."); + } + + LdLoader.MemoryArea ma = new LdLoader.MemoryArea(); + ma.name = ctx.NAME().getText(); + ma.attributes = attributes; + ma.origin = ElfinfoExprVisitor.evaluate(ctx.origin_spec().mustbe_exp()); + ma.length = ElfinfoExprVisitor.evaluate(ctx.length_spec().mustbe_exp()); + System.out.println(ma); + memoryAreas.add(ma); + return this; + } + + LdLoader.MemoryAttribute attribute; + boolean attributesInverted; + Set<LdLoader.MemoryAttribute> attributes; + + @Override + public ElfinfoGnuLdVisitor visitAttributes_opt(GnuLdParser.Attributes_optContext ctx) { + System.out.println("ElfinfoGnuLdBaseVisitor.visitAttributes_opt"); + attributes = new HashSet<>(); + return visitChildren(ctx); + } + + @Override + public ElfinfoGnuLdVisitor visitAttributeNormal(GnuLdParser.AttributeNormalContext ctx) { + System.out.println("ElfinfoGnuLdBaseVisitor.visitAttributeNormal"); + String name = ctx.NAME().getText(); + System.out.println("ctx.ATTRIBUTE().getText() = " + name); + for (int i = 0; i < name.length(); i++) { + attribute = LdLoader.MemoryAttribute.valueOf(String.valueOf(Character.toUpperCase(name.charAt(i)))); + attributes.add(attribute); + } + attributesInverted = false; + return visitChildren(ctx); + } + + @Override + public ElfinfoGnuLdVisitor visitAttributeInverted(GnuLdParser.AttributeInvertedContext ctx) { + System.out.println("ElfinfoGnuLdBaseVisitor.visitAttributeInverted"); + if (!attributes.isEmpty()) { + throw new RuntimeException("Attributes for memory areas can only be attributesInverted (with '!') as the first character in a specification; foo(!rw), not foo(x!rw)."); + } +// String name = ctx.name().getText(); + String name = ctx.NAME().getText(); + System.out.println("ctx.ATTRIBUTE().getText() = " + name); + + attributesInverted = true; + return visitChildren(ctx); + } +} |