summaryrefslogtreecommitdiff
path: root/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java')
-rw-r--r--cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java73
1 files changed, 44 insertions, 29 deletions
diff --git a/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java b/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java
index f827a8b..f3c93ac 100644
--- a/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java
+++ b/cmake/elfinfo/src/main/java/io/trygvis/ld/LdScript.java
@@ -1,12 +1,14 @@
package io.trygvis.ld;
-import io.trygvis.ld.antlr.GnuLdBaseVisitor;
import io.trygvis.ld.antlr.GnuLdLexer;
import io.trygvis.ld.antlr.GnuLdParser;
+import io.trygvis.ld.antlr.GnuLdParserBaseVisitor;
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.BufferedTokenStream;
+import org.antlr.v4.runtime.ConsoleErrorListener;
import org.antlr.v4.runtime.tree.ParseTreeProperty;
+import java.io.File;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashSet;
@@ -15,6 +17,12 @@ import java.util.Set;
public class LdScript {
+ public final List<MemoryArea> memoryAreas;
+
+ public LdScript(List<MemoryArea> memoryAreas) {
+ this.memoryAreas = memoryAreas;
+ }
+
public enum MemoryAttribute {
R, W, X, A, I,
}
@@ -76,39 +84,31 @@ public class LdScript {
String name;
}
- public static void main(String[] args) throws Exception {
- try {
- work(args);
- } catch (Exception e) {
- e.printStackTrace(System.out);
- }
- }
-
- private static void work(String[] args) throws Exception {
- args = new String[]{"lds/d2000.ld"};
+ public static LdScript parse(File path) throws Exception {
+ GnuLdLexer lexer = new GnuLdLexer(new ANTLRFileStream(path.getAbsolutePath()));
+ BufferedTokenStream tokens = new BufferedTokenStream(lexer);
+ GnuLdParser parser = new GnuLdParser(tokens);
+ parser.setBuildParseTree(true);
+ parser.removeErrorListeners();
+ ConsoleErrorListener errorListener = new ConsoleErrorListener();
+ parser.addErrorListener(errorListener);
+ CollectingErrorListener collectingErrorListener = new CollectingErrorListener();
+ parser.addErrorListener(collectingErrorListener);
- GnuLdLexer lexer = new GnuLdLexer(new ANTLRFileStream(args[0]));
- GnuLdParser parser = new GnuLdParser(new BufferedTokenStream(lexer));
+ GnuLdParser.FileContext file = parser.file();
-// ElfInfoGnuLdBaseListener listener = new ElfInfoGnuLdBaseListener();
-// parser.addParseListener(listener);
-//
-// parser.file();
-//
-// for (Section section : listener.sections) {
-// System.out.println("section.name = " + section.name);
-// }
+ if (parser.getNumberOfSyntaxErrors() > 0) {
+ throw new ParseErrorException(lexer, tokens, parser, collectingErrorListener.errors
+ );
+ }
ElfinfoGnuLdBaseVisitor visitor = new ElfinfoGnuLdBaseVisitor();
- visitor.visit(parser.file());
+ visitor.visit(file);
- System.out.println("--------------------------------------------------------");
- for (MemoryArea area : visitor.memoryAreas) {
- System.out.println(" " + area.name + "(" + area.prettyAttributes() + ") : ORIGIN = " + area.prettyOrigin() + ", LENGTH=" + area.prettyLength());
- }
+ return new LdScript(visitor.memoryAreas);
}
- private static class ElfinfoExprGnuLdBaseVisitor extends GnuLdBaseVisitor<ElfinfoExprGnuLdBaseVisitor> {
+ private static class ElfinfoExprGnuLdBaseVisitor extends GnuLdParserBaseVisitor<ElfinfoExprGnuLdBaseVisitor> {
private BigInteger value;
private ParseTreeProperty<BigInteger> es = new ParseTreeProperty<>();
@@ -227,7 +227,7 @@ public class LdScript {
}
@Override
- public ElfinfoExprGnuLdBaseVisitor visitExpAlign2(GnuLdParser.ExpAlign2Context ctx) {
+ public ElfinfoExprGnuLdBaseVisitor visitExpAlignK(GnuLdParser.ExpAlignKContext ctx) {
return visitChildren(ctx);
}
@@ -416,7 +416,7 @@ public class LdScript {
}
}
- private static class ElfinfoGnuLdBaseVisitor extends GnuLdBaseVisitor<ElfinfoGnuLdBaseVisitor> {
+ public static class ElfinfoGnuLdBaseVisitor extends GnuLdParserBaseVisitor<ElfinfoGnuLdBaseVisitor> {
public List<MemoryArea> memoryAreas = new ArrayList<>();
public List<Section> sections = new ArrayList<>();
@@ -473,6 +473,7 @@ public class LdScript {
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);
@@ -480,4 +481,18 @@ public class LdScript {
return visitChildren(ctx);
}
}
+
+ public static class ParseErrorException extends Exception {
+ public final GnuLdLexer lexer;
+ public final BufferedTokenStream tokens;
+ public final GnuLdParser parser;
+ public final List<String> errors;
+
+ public ParseErrorException(GnuLdLexer lexer, BufferedTokenStream tokens, GnuLdParser parser, List<String> errors) {
+ this.lexer = lexer;
+ this.tokens = tokens;
+ this.parser = parser;
+ this.errors = errors;
+ }
+ }
}