[llvm-dev] llvm.gcroot trouble with non-i8* allocas

Nikodemus Siivola via llvm-dev llvm-dev at lists.llvm.org
Wed Nov 1 02:59:06 PDT 2017


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<X>(Val) && "cast<Ty>() 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 _scrt_common_main_seh
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.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/c45f5aaf/attachment.html>


More information about the llvm-dev mailing list