graalvm / sulong

Obsolete repository. Moved to oracle/graal.
Other
628 stars 63 forks source link

Cannot convert com.oracle.truffle.llvm.runtime.LLVMTruffleObject to LLVMAddress #830

Closed PRIESt512 closed 6 years ago

PRIESt512 commented 6 years ago

Hello! Can you help? An error occurs when calling the method on C: int get(char * a, int q) {return a[q];} Code in Java:

File src = new File("main.bc");
try (Context context = Context.newBuilder().build()) {
Source source = Source.newBuilder("llvm", src).build();
context.eval(source);
Value get = context.lookup("llvm", "get");
byte[] aa = new byte[]{1, 2, 3, 4};
int a = get.execute(aa, 2).asInt();
}

Version - vm.enterprise.0.30.2 - downloaded from Oracle website. Tried to assemble Sulong from the repository, the error remains. Am I doing something wrong?

StackTrace:

Exception in thread "main" org.graalvm.polyglot.PolyglotException: com.oracle.truffle.llvm.runtime.SulongRuntimeException: IllegalStateException Cannot convert com.oracle.truffle.llvm.runtime.LLVMTruffleObject@6a03bcb1(offset=0) to LLVMAddress

C stack trace:
     LLVM IR Function @get in main.bc in Block {id: 0 name: implicit2}

    at com.oracle.truffle.api.interop.UnsupportedMessageException.raise(UnsupportedMessageException.java:68)
    at com.oracle.truffle.api.interop.InteropAccessNode.createMessageTarget(InteropAccessNode.java:229)
    at com.oracle.truffle.api.interop.InteropAccessNodeGen.executeAndSpecialize(InteropAccessNodeGen.java:70)
    at com.oracle.truffle.api.interop.InteropAccessNodeGen.executeImpl(InteropAccessNodeGen.java:45)
    at com.oracle.truffle.api.interop.InteropAccessNode.execute(InteropAccessNode.java:53)
    at com.oracle.truffle.api.interop.ForeignAccess.sendToNative(ForeignAccess.java:358)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactory$FallbackLibrary.toNative(LLVMObjectNativeFactory.java:114)
    at com.oracle.truffle.llvm.runtime.LLVMTruffleObject$1.toNative(LLVMTruffleObject.java:160)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactory$CachedToNativeNode.toNative(LLVMObjectNativeFactory.java:233)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactoryFactory$CachedToNativeNodeGen.executeAndSpecialize(LLVMObjectNativeFactoryFactory.java:318)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactoryFactory$CachedToNativeNodeGen.execute(LLVMObjectNativeFactoryFactory.java:283)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactory$CachingLibrary.toNative(LLVMObjectNativeFactory.java:176)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMToNativeNode.transitionToNative(LLVMToNativeNode.java:107)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMToNativeNodeGen.executeAndSpecialize(LLVMToNativeNodeGen.java:287)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMToNativeNodeGen.executeWithTarget(LLVMToNativeNodeGen.java:85)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMAddressStoreNode.doAddress(LLVMAddressStoreNode.java:57)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMAddressStoreNodeGen.executeAndSpecialize(LLVMAddressStoreNodeGen.java:82)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMAddressStoreNodeGen.executeWithTarget(LLVMAddressStoreNodeGen.java:66)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMStoreExpressionNode.store(LLVMStoreExpressionNode.java:57)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMStoreExpressionNodeGen.executeAndSpecialize(LLVMStoreExpressionNodeGen.java:47)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMStoreExpressionNodeGen.executeGeneric(LLVMStoreExpressionNodeGen.java:35)
    at com.oracle.truffle.llvm.nodes.base.LLVMBasicBlockNode.executeStatements(LLVMBasicBlockNode.java:98)
    at com.oracle.truffle.llvm.nodes.control.LLVMDispatchBasicBlockNode.executeGeneric(LLVMDispatchBasicBlockNode.java:80)
    at com.oracle.truffle.llvm.nodes.func.LLVMFunctionStartNode.execute(LLVMFunctionStartNode.java:79)
    at <llvm> @get(Unknown)
    at org.graalvm.polyglot.Value.execute(Value.java:162)
    at ru.rtec.Start.main(Start.java:23)
Original Internal Error: 
com.oracle.truffle.llvm.runtime.SulongRuntimeException: IllegalStateException Cannot convert com.oracle.truffle.llvm.runtime.LLVMTruffleObject@6a03bcb1(offset=0) to LLVMAddress

C stack trace:
     LLVM IR Function @get in main.bc in Block {id: 0 name: implicit2}

    at com.oracle.truffle.llvm.nodes.base.LLVMBasicBlockNode.executeStatements(LLVMBasicBlockNode.java:113)
    at com.oracle.truffle.llvm.nodes.control.LLVMDispatchBasicBlockNode.executeGeneric(LLVMDispatchBasicBlockNode.java:80)
    at com.oracle.truffle.llvm.nodes.func.LLVMFunctionStartNode.execute(LLVMFunctionStartNode.java:79)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callProxy(OptimizedCallTarget.java:248)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callRoot(OptimizedCallTarget.java:237)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:227)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.doInvoke(OptimizedCallTarget.java:212)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:196)
    at org.graalvm.compiler.truffle.OptimizedDirectCallNode.callProxy(OptimizedDirectCallNode.java:65)
    at org.graalvm.compiler.truffle.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:59)
    at com.oracle.truffle.llvm.runtime.interop.LLVMForeignCallNode.directCall(LLVMForeignCallNode.java:149)
    at com.oracle.truffle.llvm.runtime.interop.LLVMForeignCallNode.callDirectCached(LLVMForeignCallNode.java:142)
    at com.oracle.truffle.llvm.runtime.interop.LLVMForeignCallNodeGen.executeAndSpecialize(LLVMForeignCallNodeGen.java:97)
    at com.oracle.truffle.llvm.runtime.interop.LLVMForeignCallNodeGen.executeCall(LLVMForeignCallNodeGen.java:55)
    at com.oracle.truffle.llvm.runtime.interop.LLVMFunctionMessageResolution$ForeignExecuteNode.access(LLVMFunctionMessageResolution.java:69)
    at com.oracle.truffle.llvm.runtime.interop.LLVMFunctionMessageResolutionForeign$ForeignExecuteSubNode.accessWithTarget(LLVMFunctionMessageResolutionForeign.java:116)
    at com.oracle.truffle.llvm.runtime.interop.LLVMFunctionMessageResolutionForeignFactory$ForeignExecuteSubNodeGen.executeAndSpecialize(LLVMFunctionMessageResolutionForeignFactory.java:59)
    at com.oracle.truffle.llvm.runtime.interop.LLVMFunctionMessageResolutionForeignFactory$ForeignExecuteSubNodeGen.executeWithTarget(LLVMFunctionMessageResolutionForeignFactory.java:43)
    at com.oracle.truffle.llvm.runtime.interop.LLVMFunctionMessageResolutionForeign$ForeignExecuteSubNode$EXECUTERootNode.execute(LLVMFunctionMessageResolutionForeign.java:133)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callProxy(OptimizedCallTarget.java:248)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callRoot(OptimizedCallTarget.java:237)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:227)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.doInvoke(OptimizedCallTarget.java:212)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callDirect(OptimizedCallTarget.java:196)
    at org.graalvm.compiler.truffle.OptimizedDirectCallNode.callProxy(OptimizedDirectCallNode.java:65)
    at org.graalvm.compiler.truffle.OptimizedDirectCallNode.call(OptimizedDirectCallNode.java:59)
    at com.oracle.truffle.api.interop.InteropAccessNode.doCached(InteropAccessNode.java:186)
    at com.oracle.truffle.api.interop.InteropAccessNodeGen.executeAndSpecialize(InteropAccessNodeGen.java:80)
    at com.oracle.truffle.api.interop.InteropAccessNodeGen.executeImpl(InteropAccessNodeGen.java:45)
    at com.oracle.truffle.api.interop.InteropAccessNode.execute(InteropAccessNode.java:67)
    at com.oracle.truffle.api.interop.ForeignAccess.sendExecute(ForeignAccess.java:389)
    at com.oracle.truffle.api.vm.PolyglotValue$Interop$ExecuteNode.executeImpl(PolyglotValue.java:1394)
    at com.oracle.truffle.api.vm.PolyglotValue$Interop$InteropNode.execute(PolyglotValue.java:1003)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callProxy(OptimizedCallTarget.java:248)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callRoot(OptimizedCallTarget.java:237)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.callBoundary(OptimizedCallTarget.java:227)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.doInvoke(OptimizedCallTarget.java:212)
    at org.graalvm.compiler.truffle.OptimizedCallTarget.call(OptimizedCallTarget.java:190)
    at com.oracle.truffle.api.vm.PolyglotValue$Interop.execute(PolyglotValue.java:847)
    at org.graalvm.polyglot.Value.execute(Value.java:162)
    at ru.rtec.Start.main(Start.java:23)
Caused by: java.lang.IllegalStateException: Cannot convert com.oracle.truffle.llvm.runtime.LLVMTruffleObject@6a03bcb1(offset=0) to LLVMAddress
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMToNativeNode.transitionToNative(LLVMToNativeNode.java:111)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMToNativeNodeGen.executeAndSpecialize(LLVMToNativeNodeGen.java:287)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMToNativeNodeGen.executeWithTarget(LLVMToNativeNodeGen.java:85)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMAddressStoreNode.doAddress(LLVMAddressStoreNode.java:57)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMAddressStoreNodeGen.executeAndSpecialize(LLVMAddressStoreNodeGen.java:82)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMAddressStoreNodeGen.executeWithTarget(LLVMAddressStoreNodeGen.java:66)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMStoreExpressionNode.store(LLVMStoreExpressionNode.java:57)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMStoreExpressionNodeGen.executeAndSpecialize(LLVMStoreExpressionNodeGen.java:47)
    at com.oracle.truffle.llvm.nodes.memory.store.LLVMStoreExpressionNodeGen.executeGeneric(LLVMStoreExpressionNodeGen.java:35)
    at com.oracle.truffle.llvm.nodes.base.LLVMBasicBlockNode.executeStatements(LLVMBasicBlockNode.java:98)
    ... 40 more
Caused by: com.oracle.truffle.api.interop.UnsupportedMessageException: Message not supported: TO_NATIVE
    at com.oracle.truffle.api.interop.UnsupportedMessageException.raise(UnsupportedMessageException.java:68)
    at com.oracle.truffle.api.interop.InteropAccessNode.createMessageTarget(InteropAccessNode.java:229)
    at com.oracle.truffle.api.interop.InteropAccessNodeGen.executeAndSpecialize(InteropAccessNodeGen.java:70)
    at com.oracle.truffle.api.interop.InteropAccessNodeGen.executeImpl(InteropAccessNodeGen.java:45)
    at com.oracle.truffle.api.interop.InteropAccessNode.execute(InteropAccessNode.java:53)
    at com.oracle.truffle.api.interop.ForeignAccess.sendToNative(ForeignAccess.java:358)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactory$FallbackLibrary.toNative(LLVMObjectNativeFactory.java:114)
    at com.oracle.truffle.llvm.runtime.LLVMTruffleObject$1.toNative(LLVMTruffleObject.java:160)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactory$CachedToNativeNode.toNative(LLVMObjectNativeFactory.java:233)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactoryFactory$CachedToNativeNodeGen.executeAndSpecialize(LLVMObjectNativeFactoryFactory.java:318)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactoryFactory$CachedToNativeNodeGen.execute(LLVMObjectNativeFactoryFactory.java:283)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMObjectNativeFactory$CachingLibrary.toNative(LLVMObjectNativeFactory.java:176)
    at com.oracle.truffle.llvm.runtime.nodes.api.LLVMToNativeNode.transitionToNative(LLVMToNativeNode.java:107)
    ... 49 more
rschatz commented 6 years ago

Hi! The Message not supported: TO_NATIVE error comes from trying to store a managed object (the Java array) to native memory. That is not supported by Sulong.

Your program doesn't look like it actually stores the array anywhere, but if look at the compiled bitcode, you'll see that it still stores it on the stack if you compile it without optimizations. If you compile your C program with at least -O1, it will work.

(Actually, the optimization phase you need is mem2reg, so you could also use the opt tool to just run this one optimization, but using -O1 is easier)

I just realized that this is not mentioned in our README. I will add that.

PRIESt512 commented 6 years ago

Thank you very much! Very interesting! Thank you for the splendid project of Sulong and the Graal. Allows you to embody cool ideas :)