Hi all,
I'm trying to play with patchoint (with MCJIT and VMKit) and I don't
understand something. I generate this call for my first patch point.
Basically, I want to call f(0).
%5 = call i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(
i64 42, ;; patch point id is 42
i32 0, ;; 0 bytes for the padding
i8* bitcast (i32 (i32)* @f to i8*), ;; my function f
i32 1, ;; 1 argument
i32 0) ;; the argument
I think that the types are correct (at least, the compiler seems happy
with that:)). But when I'm trying to compile the code (that I generate
from C++, it's not a bitcode file), I have this message:
Assertion failed: (isa<X>(Val) && "cast<Ty>() argument
of incompatible
type!"), function cast, file
/Users/gthomas/research/vmkit4/llvm-src/include/llvm/Support/Casting.h,
line 232.
With this stack (I only give the relevant part):
frame #5: 0x000000010092ed44
libjvm.dylib`llvm::SelectionDAGBuilder::visitPatchpoint() + 3780 at
SelectionDAGNodes.h:610
frame #6: 0x000000010091f511
libjvm.dylib`llvm::SelectionDAGBuilder::visitIntrinsicCall(this=0x0000000106ff4d20,
I=0x0000000106fea460) + 10961 at SelectionDAGBuilder.cpp:5349
frame #7: 0x0000000100904c4a
libjvm.dylib`llvm::SelectionDAGBuilder::visitCall(this=0x0000000106ff4d20,
I=0x0000000106fea460) + 234 at SelectionDAGBuilder.cpp:5870
frame #8: 0x00000001008fc9ea
libjvm.dylib`llvm::SelectionDAGBuilder::visit(this=0x0000000106ff4d20,
I=0x0000000106fea460) + 74 at SelectionDAGBuilder.cpp:971
frame #9: 0x0000000100947e98
libjvm.dylib`llvm::SelectionDAGISel::SelectBasicBlock(this=0x0000000106ff40d0,
HadTailCall=0x00007fff5fbfe31e) + 40 at SelectionDAGISel.cpp:579
frame #10: 0x0000000100947aee
libjvm.dylib`llvm::SelectionDAGISel::SelectAllBasicBlocks(this=0x0000000106ff40d0,
Fn=0x0000000106fe7020) + 8174 at SelectionDAGISel.cpp:1192
frame #11: 0x0000000100944b94
libjvm.dylib`llvm::SelectionDAGISel::runOnMachineFunction(this=0x0000000106ff40d0)
+ 1588 at SelectionDAGISel.cpp:434
frame #12: 0x0000000100afefc0
libjvm.dylib`llvm::MachineFunctionPass::runOnFunction() + 128 at
MachineFunctionPass.cpp:33
frame #13: 0x00000001010837fb
libjvm.dylib`llvm::FPPassManager::runOnFunction(this=0x0000000106fedf20,
F=0x0000000106fe7020) + 331 at LegacyPassManager.cpp:1538
frame #14: 0x0000000101083abb
libjvm.dylib`llvm::FPPassManager::runOnModule(this=0x0000000106fedf20)
+ 59 at LegacyPassManager.cpp:1558
frame #15: 0x000000010108402d
libjvm.dylib`llvm::legacy::PassManagerImpl::run(llvm::Module&)
[inlined] llvm::legacy::PassManagerImpl::getContainedManager(N=0,
this=0x0000000106feb9f0) + 429 at LegacyPassManager.cpp:1616
frame #16: 0x0000000101083e80
libjvm.dylib`llvm::legacy::PassManagerImpl::run(this=0x0000000106feb9f0,
M=0x0000000106fe6f30) + 544 at LegacyPassManager.cpp:1711
frame #17: 0x000000010108466d
libjvm.dylib`llvm::legacy::PassManager::run() + 13 at
LegacyPassManager.cpp:1746
frame #18: 0x0000000100eeaf8c
libjvm.dylib`llvm::MCJIT::emitObject(this=0x0000000106fa69a0,
M=0x0000000106fe6f30) + 236 at MCJIT.cpp:131
frame #19: 0x0000000100eeb2d3
libjvm.dylib`llvm::MCJIT::generateCodeForModule(this=0x0000000106fa69a0,
M=0x0000000106fe6f30) + 323 at MCJIT.cpp:169
frame #20: 0x0000000100eec022
libjvm.dylib`llvm::MCJIT::getFunctionAddress(std::string const&)
[inlined] llvm::MCJIT::getSymbolAddress(this=0x0000000106fa69a0,
CheckFunctionsOnly=true) + 58 at MCJIT.cpp:279
frame #21: 0x0000000100eebfe8
libjvm.dylib`llvm::MCJIT::getFunctionAddress(this=0x0000000106fa69a0,
Name=0x00007fff5fbfe7b0) + 40 at MCJIT.cpp:295
...
So, I don't understand where could be my mistake?
Thank you in advance,
Gaël
--
-------------------------------------------------------------------
Gaël Thomas, Associate Professor, UPMC
http://pagesperso-systeme.lip6.fr/Gael.Thomas/
-------------------------------------------------------------------
On Tue, Dec 17, 2013 at 4:42 PM, Gaël Thomas <gael.thomas00 at gmail.com> wrote:> %5 = call i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64( > i64 42, ;; patch point id is 42 > i32 0, ;; 0 bytes for the padding > i8* bitcast (i32 (i32)* @f to i8*), ;; my function f > i32 1, ;; 1 argument > i32 0) ;; the argumentIt appears patchpoint doesn't yet support function symbols as the target: SelectionDAGBuilder.cpp:6949: ----------------------------------- // Assume that the Callee is a constant address. // FIXME: handle function symbols in the future. Ops.push_back( DAG.getIntPtrConstant(cast<ConstantSDNode>(Callee)->getZExtValue(), /*isTarget=*/true)); ----------------------------------- Which is hit when I attempt to run something similar to your example through llc. The assertion doesn't fail when I replace the @f bitcast with "i8* null". Hope this helps, attached is sample bitcode demonstrating the issue. ~Will -------------- next part -------------- A non-text attachment was scrubbed... Name: test.ll Type: application/octet-stream Size: 458 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131217/31a6ab77/attachment.obj>
patchpoint is intended to be used in VMs that do their own linking, and so you wouldn't expect the function parameter to be resolved by LLVM. Presumably, in VMKit, you could just plant a pointer constant to the function you wish to call initially? -Filip On Dec 17, 2013, at 2:42 PM, Gaël Thomas <gael.thomas00 at gmail.com> wrote:> Hi all, > > I'm trying to play with patchoint (with MCJIT and VMKit) and I don't > understand something. I generate this call for my first patch point. > Basically, I want to call f(0). > > %5 = call i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64( > i64 42, ;; patch point id is 42 > i32 0, ;; 0 bytes for the padding > i8* bitcast (i32 (i32)* @f to i8*), ;; my function f > i32 1, ;; 1 argument > i32 0) ;; the argument > > I think that the types are correct (at least, the compiler seems happy > with that:)). But when I'm trying to compile the code (that I generate > from C++, it's not a bitcode file), I have this message: > > Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible > type!"), function cast, file > /Users/gthomas/research/vmkit4/llvm-src/include/llvm/Support/Casting.h, > line 232. > > With this stack (I only give the relevant part): > > frame #5: 0x000000010092ed44 > libjvm.dylib`llvm::SelectionDAGBuilder::visitPatchpoint() + 3780 at > SelectionDAGNodes.h:610 > frame #6: 0x000000010091f511 > libjvm.dylib`llvm::SelectionDAGBuilder::visitIntrinsicCall(this=0x0000000106ff4d20, > I=0x0000000106fea460) + 10961 at SelectionDAGBuilder.cpp:5349 > frame #7: 0x0000000100904c4a > libjvm.dylib`llvm::SelectionDAGBuilder::visitCall(this=0x0000000106ff4d20, > I=0x0000000106fea460) + 234 at SelectionDAGBuilder.cpp:5870 > frame #8: 0x00000001008fc9ea > libjvm.dylib`llvm::SelectionDAGBuilder::visit(this=0x0000000106ff4d20, > I=0x0000000106fea460) + 74 at SelectionDAGBuilder.cpp:971 > frame #9: 0x0000000100947e98 > libjvm.dylib`llvm::SelectionDAGISel::SelectBasicBlock(this=0x0000000106ff40d0, > HadTailCall=0x00007fff5fbfe31e) + 40 at SelectionDAGISel.cpp:579 > frame #10: 0x0000000100947aee > libjvm.dylib`llvm::SelectionDAGISel::SelectAllBasicBlocks(this=0x0000000106ff40d0, > Fn=0x0000000106fe7020) + 8174 at SelectionDAGISel.cpp:1192 > frame #11: 0x0000000100944b94 > libjvm.dylib`llvm::SelectionDAGISel::runOnMachineFunction(this=0x0000000106ff40d0) > + 1588 at SelectionDAGISel.cpp:434 > frame #12: 0x0000000100afefc0 > libjvm.dylib`llvm::MachineFunctionPass::runOnFunction() + 128 at > MachineFunctionPass.cpp:33 > frame #13: 0x00000001010837fb > libjvm.dylib`llvm::FPPassManager::runOnFunction(this=0x0000000106fedf20, > F=0x0000000106fe7020) + 331 at LegacyPassManager.cpp:1538 > frame #14: 0x0000000101083abb > libjvm.dylib`llvm::FPPassManager::runOnModule(this=0x0000000106fedf20) > + 59 at LegacyPassManager.cpp:1558 > frame #15: 0x000000010108402d > libjvm.dylib`llvm::legacy::PassManagerImpl::run(llvm::Module&) > [inlined] llvm::legacy::PassManagerImpl::getContainedManager(N=0, > this=0x0000000106feb9f0) + 429 at LegacyPassManager.cpp:1616 > frame #16: 0x0000000101083e80 > libjvm.dylib`llvm::legacy::PassManagerImpl::run(this=0x0000000106feb9f0, > M=0x0000000106fe6f30) + 544 at LegacyPassManager.cpp:1711 > frame #17: 0x000000010108466d > libjvm.dylib`llvm::legacy::PassManager::run() + 13 at > LegacyPassManager.cpp:1746 > frame #18: 0x0000000100eeaf8c > libjvm.dylib`llvm::MCJIT::emitObject(this=0x0000000106fa69a0, > M=0x0000000106fe6f30) + 236 at MCJIT.cpp:131 > frame #19: 0x0000000100eeb2d3 > libjvm.dylib`llvm::MCJIT::generateCodeForModule(this=0x0000000106fa69a0, > M=0x0000000106fe6f30) + 323 at MCJIT.cpp:169 > frame #20: 0x0000000100eec022 > libjvm.dylib`llvm::MCJIT::getFunctionAddress(std::string const&) > [inlined] llvm::MCJIT::getSymbolAddress(this=0x0000000106fa69a0, > CheckFunctionsOnly=true) + 58 at MCJIT.cpp:279 > frame #21: 0x0000000100eebfe8 > libjvm.dylib`llvm::MCJIT::getFunctionAddress(this=0x0000000106fa69a0, > Name=0x00007fff5fbfe7b0) + 40 at MCJIT.cpp:295 > ... > > So, I don't understand where could be my mistake? > > Thank you in advance, > Gaël > > > > -- > ------------------------------------------------------------------- > Gaël Thomas, Associate Professor, UPMC > http://pagesperso-systeme.lip6.fr/Gael.Thomas/ > ------------------------------------------------------------------- > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131217/cdefd8a7/attachment.html>
Ok I see. Of course, at runtime, it's enough for dynamic linking or for deoptimization. However, wmkit acts both as a jit and as an aot. For the aot, it means that I can not use patchpoint and that I should have two different compilation strategy. It's not so difficult, but in this case, I can not use patchpoints to generate gc's stackmap for the aot (basically, I think that I could use a patchpoint to generate a safepoint where I know the locations of my roots by ysing them as arguments of the patchpoint?)? Do you think that using a symbol for my targets is easy to implement? Or maybe that there is a conceptual problem for symbols in this case? By the way, were can I find the metadata at the end of the compilation? They are generated in a special symbol/section? Anyway, thank you for your answer, Gaël Le 18 déc. 2013 02:17, "Filip Pizlo" <fpizlo at apple.com> a écrit :> patchpoint is intended to be used in VMs that do their own linking, and so > you wouldn't expect the function parameter to be resolved by LLVM. > > Presumably, in VMKit, you could just plant a pointer constant to the > function you wish to call initially? > > -Filip > > > On Dec 17, 2013, at 2:42 PM, Gaël Thomas <gael.thomas00 at gmail.com> wrote: > > Hi all, > > I'm trying to play with patchoint (with MCJIT and VMKit) and I don't > understand something. I generate this call for my first patch point. > Basically, I want to call f(0). > > %5 = call i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64( > i64 42, ;; patch point id is 42 > i32 0, ;; 0 bytes for the padding > i8* bitcast (i32 (i32)* @f to i8*), ;; my function f > i32 1, ;; 1 argument > i32 0) ;; the argument > > I think that the types are correct (at least, the compiler seems happy > with that:)). But when I'm trying to compile the code (that I generate > from C++, it's not a bitcode file), I have this message: > > Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible > type!"), function cast, file > /Users/gthomas/research/vmkit4/llvm-src/include/llvm/Support/Casting.h, > line 232. > > With this stack (I only give the relevant part): > > frame #5: 0x000000010092ed44 > libjvm.dylib`llvm::SelectionDAGBuilder::visitPatchpoint() + 3780 at > SelectionDAGNodes.h:610 > frame #6: 0x000000010091f511 > > libjvm.dylib`llvm::SelectionDAGBuilder::visitIntrinsicCall(this=0x0000000106ff4d20, > I=0x0000000106fea460) + 10961 at SelectionDAGBuilder.cpp:5349 > frame #7: 0x0000000100904c4a > libjvm.dylib`llvm::SelectionDAGBuilder::visitCall(this=0x0000000106ff4d20, > I=0x0000000106fea460) + 234 at SelectionDAGBuilder.cpp:5870 > frame #8: 0x00000001008fc9ea > libjvm.dylib`llvm::SelectionDAGBuilder::visit(this=0x0000000106ff4d20, > I=0x0000000106fea460) + 74 at SelectionDAGBuilder.cpp:971 > frame #9: 0x0000000100947e98 > > libjvm.dylib`llvm::SelectionDAGISel::SelectBasicBlock(this=0x0000000106ff40d0, > HadTailCall=0x00007fff5fbfe31e) + 40 at SelectionDAGISel.cpp:579 > frame #10: 0x0000000100947aee > > libjvm.dylib`llvm::SelectionDAGISel::SelectAllBasicBlocks(this=0x0000000106ff40d0, > Fn=0x0000000106fe7020) + 8174 at SelectionDAGISel.cpp:1192 > frame #11: 0x0000000100944b94 > > libjvm.dylib`llvm::SelectionDAGISel::runOnMachineFunction(this=0x0000000106ff40d0) > + 1588 at SelectionDAGISel.cpp:434 > frame #12: 0x0000000100afefc0 > libjvm.dylib`llvm::MachineFunctionPass::runOnFunction() + 128 at > MachineFunctionPass.cpp:33 > frame #13: 0x00000001010837fb > libjvm.dylib`llvm::FPPassManager::runOnFunction(this=0x0000000106fedf20, > F=0x0000000106fe7020) + 331 at LegacyPassManager.cpp:1538 > frame #14: 0x0000000101083abb > libjvm.dylib`llvm::FPPassManager::runOnModule(this=0x0000000106fedf20) > + 59 at LegacyPassManager.cpp:1558 > frame #15: 0x000000010108402d > libjvm.dylib`llvm::legacy::PassManagerImpl::run(llvm::Module&) > [inlined] llvm::legacy::PassManagerImpl::getContainedManager(N=0, > this=0x0000000106feb9f0) + 429 at LegacyPassManager.cpp:1616 > frame #16: 0x0000000101083e80 > libjvm.dylib`llvm::legacy::PassManagerImpl::run(this=0x0000000106feb9f0, > M=0x0000000106fe6f30) + 544 at LegacyPassManager.cpp:1711 > frame #17: 0x000000010108466d > libjvm.dylib`llvm::legacy::PassManager::run() + 13 at > LegacyPassManager.cpp:1746 > frame #18: 0x0000000100eeaf8c > libjvm.dylib`llvm::MCJIT::emitObject(this=0x0000000106fa69a0, > M=0x0000000106fe6f30) + 236 at MCJIT.cpp:131 > frame #19: 0x0000000100eeb2d3 > libjvm.dylib`llvm::MCJIT::generateCodeForModule(this=0x0000000106fa69a0, > M=0x0000000106fe6f30) + 323 at MCJIT.cpp:169 > frame #20: 0x0000000100eec022 > libjvm.dylib`llvm::MCJIT::getFunctionAddress(std::string const&) > [inlined] llvm::MCJIT::getSymbolAddress(this=0x0000000106fa69a0, > CheckFunctionsOnly=true) + 58 at MCJIT.cpp:279 > frame #21: 0x0000000100eebfe8 > libjvm.dylib`llvm::MCJIT::getFunctionAddress(this=0x0000000106fa69a0, > Name=0x00007fff5fbfe7b0) + 40 at MCJIT.cpp:295 > ... > > So, I don't understand where could be my mistake? > > Thank you in advance, > Gaël > > > > -- > ------------------------------------------------------------------- > Gaël Thomas, Associate Professor, UPMC > http://pagesperso-systeme.lip6.fr/Gael.Thomas/ > ------------------------------------------------------------------- > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131218/6769659f/attachment.html>