Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[GR-46599] Foreign debuginfo types #6625

Closed
wants to merge 27 commits into from

Conversation

adinn
Copy link
Collaborator

@adinn adinn commented May 17, 2023

This PR provides a fix for issue #6142.

It involves 4 sets of changes:

  1. Modification of the DebugInfoProvider API to separate out and present, via new API DebugForeignTypeInfo, information about Java interfaces (and a small number of classes) derived from WordBase and PointerBase whose purpose is to model foreign data (or, in the case of classes, foreign, raw pointers to Java data).
  1. Modification of NativeImageDebugInfoProvider to identify the relevant types and advertise them via the new API.

  2. Modification of the generic debug info model in package com.oracle.objectfile.debugentry to accomodate foreign type info.

  3. Modification of the Linux (and Windows) info generator to output a DWARF (or PECOFF) encoding of the foreign types that is intelligible to the relevant debugger.

@oracle-contributor-agreement oracle-contributor-agreement bot added the OCA Verified All contributors have signed the Oracle Contributor Agreement. label May 17, 2023
@adinn
Copy link
Collaborator Author

adinn commented May 17, 2023

Current Progress

The current PR implements all of steps 1 2 and 3.

Step 4 is complete for Linux.

Step 4 for Windows still requires the PECOFF generator to be updated to generate an appropriate encoding for foreign types.

n.b. as a minimum the PECOFF generator could simply continue to treat these types as though they were Java classes or interfaces. However, it would be better if it were able to use an equivalent encoding to the DWARF one.

Examples

(gdb) info types org.graalvm.nativeimage.c.type
All types matching regular expression "org.graalvm.nativeimage.c.type":

File JAVA:
	org.graalvm.nativeimage.c.type.CTypeConversion$CCharPointerHolder;
	typedef int8_t * org.graalvm.nativeimage.c.type.CCharPointer;
	typedef org.graalvm.nativeimage.c.type.CCharPointer * org.graalvm.nativeimage.c.type.CCharPointerPointer;
	typedef double * org.graalvm.nativeimage.c.type.CDoublePointer;
	typedef float * org.graalvm.nativeimage.c.type.CFloatPointer;
	typedef int32_t * org.graalvm.nativeimage.c.type.CIntPointer;
	typedef org.graalvm.nativeimage.c.type.CIntPointer * org.graalvm.nativeimage.c.type.CIntPointerPointer;
	typedef int64_t * org.graalvm.nativeimage.c.type.CLongPointer;
	typedef int16_t * org.graalvm.nativeimage.c.type.CShortPointer;
	typedef void * org.graalvm.nativeimage.c.type.VoidPointer;
	typedef org.graalvm.word.WordBase * org.graalvm.nativeimage.c.type.WordPointer;

File org/graalvm/nativeimage/c/type/CTypeConversion.java:
	org.graalvm.nativeimage.c.type.CTypeConversion;
	org.graalvm.nativeimage.c.type.CTypeConversion$CCharPointerPointerHolder;
(gdb) ptype 'org.graalvm.nativeimage.c.type.CIntPointer'
type = int32_t *
(gdb) info types IsolateThread
All types matching regular expression "IsolateThread":

File JAVA:
	typedef org.graalvm.nativeimage.IsolateThread * com.oracle.svm.core.c.function.CEntryPointNativeFunctions$IsolateThreadPointer;
	typedef void * org.graalvm.nativeimage.IsolateThread;
(gdb) ptype 'com.oracle.svm.core.jni.headers.JNIJavaVM'
type = struct JavaVM_ {
    com.oracle.svm.core.jni.headers.JNIInvokeInterface functions;
} *
(gdb) ptype 'com.oracle.svm.core.jni.headers.JNIInvokeInterface'
type = struct JNIInvokeInterface_ {
    org.graalvm.nativeimage.Isolate reserved0;
    org.graalvm.nativeimage.c.function.CFunctionPointer DestroyJavaVM;
    org.graalvm.nativeimage.c.function.CFunctionPointer AttachCurrentThread;
    org.graalvm.nativeimage.c.function.CFunctionPointer DetachCurrentThread;
    com.oracle.svm.core.jni.headers.JNIFunctionPointerTypes$GetEnvFunctionPointer GetEnv;
    org.graalvm.nativeimage.c.function.CFunctionPointer AttachCurrentThreadAsDaemon;
} *

Notable Changes

Foreign types appear as interfaces in the Java type system i.e. as object references. However, they manifest (for the most part) as raw pointers at runtime, whether that be to pointers to foreign primitive values, structs, other pointers or simply undifferentiated (except, perhaps, as signed or unsigned) foreign words.

The DWARF encoding uses the Java type name as a typdef to label the relevant pointer types rather than the data referenced by the pointer. So, for example, the foreign types used to model foreign pointers of type char * and a char ** appear in gdb as follows

(gdb) info types CCharPointer
All types matching regular expression "CCharPointer":

File JAVA:
	org.graalvm.nativeimage.c.type.CTypeConversion$CCharPointerHolder;
	typedef int8_t * org.graalvm.nativeimage.c.type.CCharPointer;
	typedef org.graalvm.nativeimage.c.type.CCharPointer * org.graalvm.nativeimage.c.type.CCharPointerPointer;
    . . .
(gdb) ptype 'org.graalvm.nativeimage.c.type.CCharPointer'
type = int8_t *
(gdb) ptype 'org.graalvm.nativeimage.c.type.CCharPointerPointer'
type = int8_t **

n.b. As an aside, appropriate at this point, I'll mention that I have deliberately chosen to use 'int8_t' as the name for the target type rather than char because of the obvious name clash with the Java type. Also, it is int8_t rather than uint8_t because the element info that defines the target type as a 1 byte integer does not mark it as unsigned.

This naming convention differs from the approach used with proper Java types where the Java name is used to label the underlying struct. It makes sense because a CCharPointer is clearly meant to be a pointer to a char. However, this also implies that in method or function signatures a foreign type parameter or return valueappears without the dereference operator * e.g.

(gdb) info func dumpToLog
All functions matching regular expression "dumpToLog":

File com/oracle/svm/core/threadlocal/VMThreadLocalInfos.java:
63:	void com.oracle.svm.core.threadlocal.VMThreadLocalInfos::dumpToLog(com.oracle.svm.core.log.Log*, org.graalvm.nativeimage.IsolateThread, bool);

Note that this different naming convention has required a corresponding modification to the mangled name encoding employed when generating local or global symbols for the foreign types.

@adinn adinn force-pushed the foreign_debuginfo_types branch 3 times, most recently from c566571 to 8d45c39 Compare May 17, 2023 14:54
@adinn
Copy link
Collaborator Author

adinn commented May 17, 2023

@olpaw @christianhaeubl You might want to have a preliminary look at this and comment on the choices I have made regarding the DWARF encoding for foreign types and how that appears when viewed via gdb.

@christianhaeubl It would be very helpful if you could direct me at a simple example program that employs foreign data (whether explicitly or implicitly via, say, the GC) that I can use to verify the corrcetness of the encoding and its clarity/utility.

@stooke I would welcome your input on what might be done to ensure the Windows debug info is complete now that some of the Java types appear in the generic debug model via ForeignTypeEntry rather than InterfaceEntry or ClassEntry.

@olpaw olpaw self-assigned this May 17, 2023
@adinn adinn force-pushed the foreign_debuginfo_types branch 2 times, most recently from bc83d12 to 50bec16 Compare May 17, 2023 16:21
@stooke
Copy link
Contributor

stooke commented May 17, 2023

@adinn I've had a chance to (quickly) review your changes as they impact the Windows PE/COFF code. Your fix to CVTypeSectionBuilder.java should prevent the code from dying a death the first time a foreign type is encountered.
It's difficult for me to see in the abstract what the issues will be, but optimistically it should only take a few lines in getIndexForPointerOrPrimitive(). If I can, I'll try to build from your PR before I head off on PTO and see how far I get.

As the Windows code maps java primitive types to C types, unfortunately I don't think I can have the debugger differentiate between java char and c++ uint8_t.

@adinn
Copy link
Collaborator Author

adinn commented May 18, 2023

@adinn I've had a chance to (quickly) review your changes as they impact the Windows PE/COFF code. Your fix to CVTypeSectionBuilder.java should prevent the code from dying a death the first time a foreign type is encountered.
It's difficult for me to see in the abstract what the issues will be, but optimistically it should only take a few lines in getIndexForPointerOrPrimitive(). If I can, I'll try to build from your PR before I head off on PTO and see how far I get.

Ok, fingers crossed. Let me know if there are problems that need I need to address in the stages that feed the PECOFF generator.

As the Windows code maps java primitive types to C types, unfortunately I don't think I can have the debugger differentiate between java char and c++ uint8_t.

Contrariwise, if that is already a lost cause then introducing foreign type info the PECOFF encoding cannot compound the damage :-)

Copy link
Collaborator

@zakkak zakkak left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The changes look good to me.

@christianhaeubl It would be very helpful if you could direct me at a simple example program that employs foreign data (whether explicitly or implicitly via, say, the GC) that I can use to verify the corrcetness of the encoding and its clarity/utility.

+1

I have deliberately chosen to use 'int8_t' as the name for the target type rather than char because of the obvious name clash with the Java type.

Is char8_t (available since C++20) too new to be used instead of int8_t?

@adinn
Copy link
Collaborator Author

adinn commented May 22, 2023

Is char8_t (available since C++20) too new to be used instead of int8_t?

No, I don't think it is too new but it may be unadvisable.

At the moment all the generator knows is that some foreign POINTER types point to integral values with known byte size and signedness. So, I generate names accordingly like uint8_t, int32_t, etc. Much as I could swap char for int when the bit count is 8, I think I prefer the above uniformity to consistency with the slightly weird norms of C nomenclature.

The original distinction between char for single byte integral values vs various, possibly short or long, flavours of int for multi byte integral values is a somewhat unfortunate artefact of C pre-history. It has eventually landed us with the nonsense of char8_t and int8_t both having the same sense in terms of the underlying integral representation yet being distinguished as a sop to different intended usage (we won't even consider the merits of long64_t and int64_t). That distinction also foreshadows the need for char16_t (wide chars) vs, say, short in or int16_t. I think I'd rather avoid the whole can of worms.

@christianhaeubl
Copy link
Member

christianhaeubl commented May 22, 2023

@adinn: here are a few examples for @RawStructures and how you could inspect them with gdb:

  • com.oracle.svm.core.genscavenge.AlignedHeapChunk.AlignedHeader (signed/unsigned data, inheritence, pinned object data): run any non-trivial application (it only needs to perform a GC) and set a breakpoint in YoungGeneration.promoteAlignedObject(...)

  • com.oracle.svm.core.jfr.JfrBuffer (primitive data and native pointers): build and run a JFR test case and set a breakpoint at the end of JfrThreadLocal.getNativeBuffer(...). Command line for building and executing: graal/substratevm$ mx native-unittest -p TestJavaMonitorWaitEvent --build-args -g -O0

  • com.oracle.svm.core.heap.dump.HeapDumpMetadata.ClassInfo (pointers to other @RawStructures, pinned object data): build any native image with --enable-monitoring=heapdump. Run the image with -XX:+DumpHeapAndExit and set a breakpoint in HeapDumpMetadata.initialize().

Copy link
Member

@olpaw olpaw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are very close now. Only one small fix needed.

@olpaw olpaw changed the title Foreign debuginfo types [GR-46599] Foreign debuginfo types Jun 12, 2023
@olpaw
Copy link
Member

olpaw commented Jun 12, 2023

Running in internal CI to find potential issues in internal gates ... ⌛

@olpaw
Copy link
Member

olpaw commented Jun 12, 2023

I'll take it from here. Small adjustments to get this merged will be on #6774

@olpaw
Copy link
Member

olpaw commented Jun 13, 2023

@adinn unfortunately I do get NPEs in EE gates. They fail with:

com.oracle.svm.core.util.VMError$HostedError: java.lang.UnsupportedOperationException: null not supported as key!
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.VMError.shouldNotReachHere(VMError.java:82)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImage.write(NativeImage.java:167)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImageViaCC.write(NativeImageViaCC.java:98)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:735)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:544)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:408)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:594)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.start(NativeImageGeneratorRunner.java:134)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:94)
Caused by: java.lang.UnsupportedOperationException: null not supported as key!
	at org.graalvm.sdk/org.graalvm.collections.EconomicMapImpl.checkKeyNonNull(EconomicMapImpl.java:640)
	at org.graalvm.sdk/org.graalvm.collections.EconomicMapImpl.get(EconomicMapImpl.java:242)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfDebugInfo.lookupTypeProperties(DwarfDebugInfo.java:558)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfDebugInfo.getTypeIndex(DwarfDebugInfo.java:592)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfSectionImpl.getTypeIndex(DwarfSectionImpl.java:797)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeEmbeddedArrayDataType(DwarfInfoSectionImpl.java:1366)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeStructField(DwarfInfoSectionImpl.java:344)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.lambda$writeStructFields$4(DwarfInfoSectionImpl.java:323)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1707)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeStructFields(DwarfInfoSectionImpl.java:322)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeForeignStructLayout(DwarfInfoSectionImpl.java:982)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeForeignLayout(DwarfInfoSectionImpl.java:923)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeInstanceClassInfo(DwarfInfoSectionImpl.java:409)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.lambda$writeInstanceClasses$5(DwarfInfoSectionImpl.java:388)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1707)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeInstanceClasses(DwarfInfoSectionImpl.java:387)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.generateContent(DwarfInfoSectionImpl.java:190)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfInfoSectionImpl.writeContent(DwarfInfoSectionImpl.java:117)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.ObjectFile.debugContext(ObjectFile.java:1833)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.dwarf.DwarfSectionImpl.getOrDecideContent(DwarfSectionImpl.java:643)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.elf.ELFUserDefinedSection.getOrDecideContent(ELFUserDefinedSection.java:110)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.ObjectFile.bake(ObjectFile.java:1625)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.ObjectFile.write(ObjectFile.java:1282)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.ObjectFile.lambda$write$5(ObjectFile.java:1274)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.ObjectFile.withDebugContext(ObjectFile.java:1814)
	at org.graalvm.nativeimage.objectfile/com.oracle.objectfile.ObjectFile.write(ObjectFile.java:1273)
	at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.image.NativeImage.write(NativeImage.java:165)
	... 7 more

I think it has to do with compressed references. I will keep you updated.

@adinn
Copy link
Collaborator Author

adinn commented Jun 13, 2023

@olpaw Hmm, it would be interesting to know what the struct and struct field are when this blows up.

The assumption at the point where the NPE happens is that an ADDRESS struct field will be typed by dereferencing a foreign pointer type to a known foreign target type. The pointer type is the derived from return type of the ADDRESS getter. Which means the filed itself must either be a value of the target type or an array of such values. That explains why the call to getPointerTo() is unchecked (it should, of course, have been asserted non-null).

It might well be that in this specific case we have a struct field whose ADDRESS getter return a pointer to a foreign primitive type (or maybe a Word type?). I may not have correctly catered for that case.

If you have a problem debugging this and can provide a reproducer I will be happy to help investigate.

@adinn
Copy link
Collaborator Author

adinn commented Jun 13, 2023

@olpaw n.b. when I say a pointer type I mean a ForeignTypeEntry derived from a ResolvedJavaType which 1) is a subclass of PointerBase and 2) has attached element info with kind POINTER. Of course, that does not on its own guarantee that getPointerTo() will return non-null. The latter method uses a value established in the call to ForeignTypeEntry::addDebugInfo. The lookup checks the target of the CPointerTo annotation on the ResolvedJavaType. If it is non-null then it ought to map to another ForeignTypeEntry that was created when traversing the image's type list. So, a null return from getPointerTo() could indicate 1) a missing CPointerTo annotation (maybe because it is inherited?) or 2) a lookup failure when translating from the ResolvedJavaClass referenced in the annotation to the expected ForeignTypeEntry.

@adinn
Copy link
Collaborator Author

adinn commented Jun 14, 2023

@olpaw I think I may understand where the problem is coming from here. It is quite possible for ForeignTypeEntry::isPointer() to return true and ForeignTypeEntry::getPointerTo() to return false. Indeed that case is catered for when writing the info for the type by generating a DW_TAG_pointer_type record that references the corresponding DW_TAG_base_type record for type void.

So, when defining the type for an embedded (ADDRESS getter) struct element/element array field this case needs to be detected and handled correctly. The current code assumes that the 'isPointer()' ForeignTypeEntry identified by the return type of the ADDRESS getter will return a non-null value from getPointerTo().

Unfortunately, when this return value is null because I have encoded the pointer type as void *. So, using the same case handling would mean declaring the struct field to have type void or void[] which is obviously not going to work. So, I think I will need to use a suitable pointer to integral (WORD) type for these cases e.g. uint64_t *.

@olpaw
Copy link
Member

olpaw commented Jun 14, 2023

Hmm, it would be interesting to know what the struct and struct field are when this blows up.

@adinn the struct in question is com.oracle.svm.core.code.CodeInfoPointer which is a @RawPointerTo to the com.oracle.svm.core.code.CodeInfo @RawStructure.

I can only reproduce with mx debuginfotest --with-isolates-only --gc=G1

@olpaw
Copy link
Member

olpaw commented Jun 14, 2023

Adding

diff --git a/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debugentry/ForeignTypeEntry.java b/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debugentry/ForeignTypeEntry.java
index 825984255b8..05c543da943 100644
--- a/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debugentry/ForeignTypeEntry.java
+++ b/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debugentry/ForeignTypeEntry.java
@@ -78,6 +78,8 @@ public class ForeignTypeEntry extends ClassEntry {
             ResolvedJavaType referent = debugForeignTypeInfo.pointerTo();
             if (referent != null) {
                 pointerTo = debugInfoBase.lookupTypeEntry(referent);
+            } else {
+                System.out.println("FLAG_POINTER without pointerTo: " + debugForeignTypeInfo.typeName() + '(' + debugForeignTypeInfo.typedefName() + ')');
             }
         } else if (debugForeignTypeInfo.isIntegral()) {
             flags = FLAG_INTEGRAL;

shows me the following problematic cases:

FLAG_POINTER without pointerTo: com.oracle.svm.core.code.CodeInfoPointer(CodeInfo*)
FLAG_POINTER without pointerTo: com.oracle.svm.core.heap.dump.HeapDumpMetadata$FieldInfoPointer(FieldInfo*)
FLAG_POINTER without pointerTo: com.oracle.svm.core.heap.dump.HeapDumpMetadata$FieldNamePointer(FieldName*)
FLAG_POINTER without pointerTo: com.oracle.svm.core.thread.PlatformThreads$OSThreadHandlePointer(OSThreadHandle*)

@adinn
Copy link
Collaborator Author

adinn commented Jun 14, 2023

@olpaw I believe the assumption that an ADDRESS-only struct field has a known foreign type is actually valid. What is missing -- apart from the asserts that getPointerTo() returns non-null -- is a lookup of the pointerTo value via a RawPointerTo annotation when the debug info provider is creating a DebugForeignTypeInfo instance. The current code only looks up target types declared via a CPointerTo annotation.

I have just pushed a patch which adds the secondary lookup. It also asserts that getPointerTo() returns non-null when we are attempting to type an embedded struct field. It passes debuginfotest without G1. Please let me know if this resolves the issue when running with G1.

@olpaw
Copy link
Member

olpaw commented Jun 14, 2023

Please let me know if this resolves the issue when running with G1.

Yes. 75a2a27 fixes the issue.
I'm cherry-picking it over to #6774

@olpaw
Copy link
Member

olpaw commented Jun 14, 2023

There is one more aarch64 specific issue. On EE I see

(gdb) stepi
method prologue is unexpectedly long, did not reach end after 6 stepis

on some gates. I assume I just need to increase max_num_stepis a bit for aarch64.

@adinn
Copy link
Collaborator Author

adinn commented Jun 14, 2023

There is one more aarch64 specific issue. On EE I see

  (gdb) stepi
  method prologue is unexpectedly long, did not reach end after 6 stepis

on some gates. I assume I just need to increase max_num_stepis a bit for aarch64.

Yes, I guess that is all that will be needed. It would probably be best to eyeball the instruction sequence just to be sure that the EE build is still terminating the prologue with an instruction that matches instruction_adjusts_sp_register_pattern.

@olpaw
Copy link
Member

olpaw commented Jun 14, 2023

Yes, I guess that is all that will be needed. It would probably be best to eyeball the instruction sequence just to be sure that the EE build is still terminating the prologue with an instruction that matches instruction_adjusts_sp_register_pattern

The issue was something else entirely.
For some reason (I have yet to figure out) in our aarch gates we see 'amd64' for arch in testhello.py and thus the if arch == "aarch64" branch is never taken.

@olpaw
Copy link
Member

olpaw commented Jun 19, 2023

PR is now in the merge queue and should land on master today.

graalvmbot pushed a commit that referenced this pull request Jun 20, 2023
@olpaw
Copy link
Member

olpaw commented Jun 20, 2023

Merged as #6774

@olpaw olpaw closed this Jun 20, 2023
@adinn
Copy link
Collaborator Author

adinn commented Jun 20, 2023

Merged as #6774

@olpaw Thanks for all your help getting this merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
native-image-debuginfo OCA Verified All contributors have signed the Oracle Contributor Agreement. redhat-interest
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants