[LLVMdev] Problem linking llvm_gc_collect
Tom Brown
tdbrown at uiuc.edu
Sat Dec 11 18:29:39 PST 2004
We are trying to start an explicit garbage collect by calling
llvm_gc_collect(). We have the function declared in GCInterface.h
with the following lines:
#ifdef __cplusplus
#define C_LINKAGE extern "C"
#else
#define C_LINKAGE
#endif
C_LINKAGE void llvm_gc_initialize(unsigned InitialHeapSize);
C_LINKAGE void llvm_gc_collect();
and I can see it in the gc byte code,
$ llvm-nm GC/Generational/Debug/generational.bc | egrep '(collect|initialize)'
T llvm_gc_initialize
t _Z22collect_between_levelsii
T llvm_gc_collect
d _ZZ18llvm_gc_initializeE19__PRETTY_FUNCTION__
d _ZZ22collect_between_levelsiiE19__PRETTY_FUNCTION__
and the unlinked calls from our test code:
$ llvm-nm GC/gc_alloc_type_tag.bc | egrep '(collect|initialize)'
U llvm_gc_initialize
U llvm_gc_collect
then I link with
$ llvm-link -v -f -o linked.bc GC/gc_alloc_type_tag.bc ../../../../runtime/GC/Generational/Debug/generational.bc
Loading 'GC/gc_alloc_type_tag.bc'
Loading '../../../../runtime/GC/Generational/Debug/generational.bc'
Linking in '../../../../runtime/GC/Generational/Debug/generational.bc'
Writing bytecode...
and look at nm
$ llvm-nm linked.bc | egrep '(collect|initialize)'
T llvm_gc_initialize
U llvm_gc_collect
t _Z22collect_between_levelsii
T llvm_gc_collect
d _ZZ18llvm_gc_initializeE19__PRETTY_FUNCTION__
d _ZZ22collect_between_levelsiiE19__PRETTY_FUNCTION__
Note that llvm_gc_collect is listed twice, as T and U.
llvm_gc_initialize is only in T.
Running linked.bc fails when it calls llvm_gc_collect
$ lli linked.bc
...
llvm_gc_allocate_level(12, 0) -> 0x872e218, 39 bytes free
ERROR: Program used external function 'llvm_gc_collect' which could
not be resolved!
lli((anonymous namespace)::PrintStackTrace()+0x1a)[0x8573e52]
lli((anonymous namespace)::SignalHandler(int)+0xcb)[0x85740c5]
[0xffffe420]
lli(llvm::JIT::getPointerToFunction(llvm::Function*)+0x129)[0x830f85f]
The only difference I can see between llvm_gc_collect and
llvm_gc_initialize is that
_ZZ18llvm_gc_initializeE19__PRETTY_FUNCTION__ is in the data section
of generational.bc but there is no corresponding munged version of
llvm_gc_collect. Any hints on making this work?
Thanks,
Tom
--
28 70 20 71 2C 65 29 61 9C B1 36 3D D4 69 CE 62 4A 22 8B 0E DC 3E
mailto:tdbrown at uiuc.edu
http://thecap.org/
More information about the llvm-dev
mailing list