Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8217781

jextract can not find field offset of field with inline struct/union decl. if it is nested in an anonymous struct/union

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • repo-panama
    • repo-panama
    • tools

      Jextract fails on the following test case:

      test.h
      ```
      struct Foo {
          struct {
              union {
                  int x;
              } Bar;
          };
      };
      ```

      With the following exception:

      jdk.internal.clang.TypeLayoutError: InvalidFieldName. type: Type{ spelling=struct Foo, kind=Record }, fieldName: x
              at jdk.internal.clang/jdk.internal.clang.Type.getOffsetOf(Type.java:58)
              at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:159)
              at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.lambda$offsetOf$0(RecordLayoutComputer.java:162)
              at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:229)
              at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
              at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
              at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
              at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
              at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
              at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
              at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
              at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:511)
              at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:163)
              at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.lambda$offsetOf$0(RecordLayoutComputer.java:162)
              at java.base/java.util.stream.ReferencePipeline$5$1.accept(ReferencePipeline.java:229)
              at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
              at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
              at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
              at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
              at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
              at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
              at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
              at java.base/java.util.stream.LongPipeline.findFirst(LongPipeline.java:511)
              at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.offsetOf(RecordLayoutComputer.java:163)
              at jdk.jextract/com.sun.tools.jextract.tree.StructLayoutComputer.processField(StructLayoutComputer.java:61)
              at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.compute(RecordLayoutComputer.java:115)
              at jdk.jextract/com.sun.tools.jextract.tree.RecordLayoutComputer.compute(RecordLayoutComputer.java:68)
              at jdk.jextract/com.sun.tools.jextract.tree.LayoutUtils.getRecordLayout(LayoutUtils.java:208)
              at jdk.jextract/com.sun.tools.jextract.tree.StructTree.layout(StructTree.java:136)
              at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.visitStruct(AsmCodeFactory.java:286)
              at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.visitStruct(AsmCodeFactory.java:73)
              at jdk.jextract/com.sun.tools.jextract.tree.StructTree.accept(StructTree.java:103)
              at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.generateDecl(AsmCodeFactory.java:438)
              at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
              at jdk.jextract/com.sun.tools.jextract.AsmCodeFactory.generateNativeHeader(AsmCodeFactory.java:112)
              at jdk.jextract/com.sun.tools.jextract.JextractTool.generateHeader(JextractTool.java:82)
              at jdk.jextract/com.sun.tools.jextract.JextractTool.lambda$processHeaders$3(JextractTool.java:74)
              at java.base/java.util.HashMap.forEach(HashMap.java:1333)
              at jdk.jextract/com.sun.tools.jextract.JextractTool.processHeaders(JextractTool.java:74)
              at jdk.jextract/com.sun.tools.jextract.Main.run(Main.java:264)
              at jdk.jextract/com.sun.tools.jextract.Main.main(Main.java:334)

      From some debugging; jextract is trying to find the offset of the anonymous struct in Foo, but since it can't lookup the offset by the name of the field (as it's anonymous) it instead tries to find the offset of it's first field, which is Bar. But, the current code is instead looking for the first child _cursor_, which in this case is the union decl. and this causes the failure.

            jvernee Jorn Vernee
            jvernee Jorn Vernee
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: