[LLVMdev] global symbols converted to local symbols

Frits van Bommel fvbommel at wxs.nl
Thu Oct 30 03:52:08 PDT 2008

Ryan M. Lefever wrote:
> Ryan M. Lefever wrote:
>> I have a bitcode file x.bc.  When I run llmv-nm on x.bc, it shows that a 
>> function f(), that I've written, is defined as a global function (text) 
>> object, i.e., llvm-nm shows it marked with a 'T'.  I have converted x.bc 
>> to an executable with the following command:  llvm-ld -native -o x.exe 
>> x.bc  When I run nm on x.exe, it shows that f is now a local function 
>> (text) object, i.e., nm shows it marked with a 't'.  Why is llvm-ld 
>> converting f() from a global function object to a local function object.
 > As a follow up, if I first convert x.bc to a c file using llc -march=c
 > -o x.c x.bc, and then I use normal gcc to convert x.c to an executable,
 > f() remains a global symbol.  Is llvm-nm incorrectly converting the
 > global symbols to local symbols?

I believe your problem may be that llvm-ld by default runs the 
'internalize' pass before running any other optimizations. What that 
pass does is mark any functions other than 'main' (or functions 
explicitly specified by the user) as 'internal'. This is done to allow 
other optimizations to modify the function signatures; many 
interprocedural optimizations refuse to touch non-internal functions.
If you want to disable this behavior entirely, pass 
-disable-internalize' to llvm-ld. If you want to disable it only for 
specific functions (recommended if you want to optimize your code) try 
-internalize-public-api-file=<filename> or 
If you use either of the latter two, make sure to put 'main' on the list 
as well; it doesn't look like 'internalize' does that automatically 
anymore if it's passed an explicit list.

More information about the llvm-dev mailing list