[llvm-dev] llvm.gcroot trouble with non-i8* allocas (original) (raw)

Nikodemus Siivola via llvm-dev llvm-dev at lists.llvm.org
Wed Nov 1 14:26:09 PDT 2017


Solved by using alloca i8*, i32 2 which the system seems happy enough with, and bitcasting to the actual type for rest of the code after llvm.gcroot.

Not entirely sure if this is a terrible workaround or exactly the way gcroot is supposed to be used...

On Wed, Nov 1, 2017 at 11:59 AM, Nikodemus Siivola < nikodemus at random-state.net> wrote:

I'm allocating { i8*, i32 } on the stack, and would like to add this as a GC root, but I'm having trouble figuring this out.

This works as expected: declare void @llvm.gcroot(i8** %ptrloc, i8* %metadata) define i8* @bar(i8* %x) gc "shadow-stack" { entry: %objptr = alloca i8* call void @llvm.gcroot(i8** %objptr, i8* null) store i8* %x, i8** %objptr %v = load i8*, i8** %objptr ret i8* %v } However, when I have this: define { i8*, i32 } @foo({ i8*, i32 } %x) gc "shadow-stack" { entry: %objptr = alloca { i8*, i32 } %rootptr = bitcast { i8*, i32 }* %objptr to i8** call void @llvm.gcroot(i8** %rootptr, i8* null) store { i8*, i32 } %x, { i8*, i32 }* %objptr %v = load { i8*, i32 }, { i8*, i32 }* %objptr ret { i8*, i32 } %v } llc says: llvm.gcroot parameter #1 must either be a pointer alloca, or argument #2 must be a non-null constant. call void @llvm.gcroot(i8** %rootptr, i8* null) ...and if I do as it asks and add a metadata then I get a crash: @info = constant i8 1 define { i8*, i32 } @quux({ i8*, i32 } %x) gc "shadow-stack" { entry: %objptr = alloca { i8*, i32 } %rootptr = bitcast { i8*, i32 }* %objptr to i8** call void @llvm.gcroot(i8** %rootptr, i8* @info) store { i8*, i32 } %x, { i8*, i32 }* %objptr %v = load { i8*, i32 }, { i8*, i32 }* %objptr ret { i8*, i32 } %v } leads llc into this: Assertion failed: isa(Val) && "cast() argument of incompatible type!", file C:\Users\nikod\src\llvm\include\llvm/Support/Casting.h, line 236 _Wrote crash dump file "C:\Users\nikod\AppData\Local_ Temp\llc.exe-7b1546.dmp" _#0 0x01a26809 HandleAbort c:\users\nikod\src\llvm\lib_ support\windows\signals.inc:405:0 #1 0x75804188 (C:\WINDOWS\System32\ucrtbase.dll+0xa4188) #2 0x75805422 (C:\WINDOWS\System32\ucrtbase.dll+0xa5422) #3 0x75806dc5 (C:\WINDOWS\System32\ucrtbase.dll+0xa6dc5) #4 0x75806ce8 (C:\WINDOWS\System32\ucrtbase.dll+0xa6ce8) #5 0x7580618b (C:\WINDOWS\System32\ucrtbase.dll+0xa618b) #6 0x75806e26 (C:\WINDOWS\System32\ucrtbase.dll+0xa6e26) _#7 0x013786a6 InsertRootInitializers c:\users\nikod\src\llvm\lib_ codegen\gcrootlowering.cpp:172:0 #8 0x01378d97 anonymous namespace'::LowerIntrinsics::PerformDefaultLowering_ _c:\users\nikod\src\llvm\lib\codegen\gcrootlowering.cpp:249:0_ _#9 0x01379986 anonymous namespace'::LowerIntrinsics::runOnFunction c:\users\nikod\src\llvm\lib\codegen\gcrootlowering.cpp:195:0 #10 0x016a343c llvm::FPPassManager::runOnFunction(class llvm::Function &) c:\users\nikod\src\llvm\lib\ir\legacypassmanager.cpp:1513:0 #11 0x016a35e4 llvm::FPPassManager::runOnModule(class llvm::Module &) c:\users\nikod\src\llvm\lib\ir\legacypassmanager.cpp:1533:0 #12 0x016a382c `anonymous namespace'::MPPassManager::runOnModule c:\users\nikod\src\llvm\lib\ir\legacypassmanager.cpp:1590:0 #13 0x016a2e0e llvm::legacy::PassManagerImpl::run(class llvm::Module &) c:\users\nikod\src\llvm\lib\ir\legacypassmanager.cpp:1693:0 _#14 0x01000a62 compileModule c:\users\nikod\src\llvm\tools_ llc\llc.cpp:534:0 #15 0x010059ca main c:\users\nikod\src\llvm\tools\llc\llc.cpp:289:0 _#16 0x01be99e9 scrtcommonmainseh f:\dd\vctools\crt\vcstartup_ src\startup\execommon.inl:253:0 #17 0x77178744 (C:\WINDOWS\System32\KERNEL32.DLL+0x18744) #18 0x7737582d (C:\WINDOWS\SYSTEM32\ntdll.dll+0x6582d) #19 0x773757fd (C:\WINDOWS\SYSTEM32\ntdll.dll+0x657fd) (This is the same assertion failure that my full code produces, and which lead me to trying out things with minimal case and llc.) What I can see in the debugger isn't immediately illuminating. Any clues? Am I missing the obvious here? This is: LLVM (http://llvm.org/): LLVM version 4.0.1 DEBUG build with assertions. Default target: i686-pc-windows-msvc Host CPU: skylake Cheers, -- nikodemus -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171101/ab050d01/attachment-0001.html>



More information about the llvm-dev mailing list