[LLVMdev] Internalize pass
Talin
viridia at gmail.com
Fri Oct 2 22:16:01 PDT 2009
Well, after some investigation I have a few more clues as to what is
going on.
I have a module which contains a call to an external native function.
This native function lives in a static library, and there is an external
declaration for it in the module.
I find that I can run "llvm-ld -disable-opts -native -l mylibrary
test.bc" and it works fine. That is, llvm-ld is able to generate a
native object file, and link it against the static library with no problem.
However, if I remove the "-disable-opts" line, it seems to replace the
call to the native function with "unreachable". I'm not 100% certain of
this, but if I replace the native function with a non-native function
that does something similar, then it seems to work ok.
Chris Lattner wrote:
>
> On Sep 30, 2009, at 12:06 AM, Talin wrote:
>
>> I'm playing around with different combinations of LTO passes, and
>> I've run into a strange problem:
>>
>> I have a 'main' function that looks like this:
>>
>> define i32
>> @"main(tart.core.Array[tart.core.String])->int"(%"tart.core.Array[tart.core.String]"*
>> %args) {
>> entry:
>> call void @llvm.dbg.func.start(metadata !0)
>> call void @llvm.dbg.stoppoint(i32 2, i32 19, metadata !1)
>> %integerLimitsTest = call { } @integerLimitsTest() ; <{ }> [#uses=0]
>> call void @llvm.dbg.stoppoint(i32 3, i32 21, metadata !1)
>> %integerToStringTest = call { } @integerToStringTest() ; <{ }>
>> [#uses=0]
>> call void @llvm.dbg.stoppoint(i32 4, i32 9, metadata !1)
>> call void @llvm.dbg.region.end(metadata !0)
>> ret i32 0
>> }
>>
>> However, when I add an internalize pass before the other LTO passes,
>> the 'main' function turns into this:
>>
>> define i32 @main(i32, i8** nocapture) nounwind readnone {
>> entry:
>> tail call void @llvm.dbg.func.start(metadata !0)
>> tail call void @llvm.dbg.stoppoint(i32 3, i32 21, metadata !1)
>> unreachable
>> }
>>
>> The thing is, there's nothing particularly special or interesting
>> about the functions being called from main().
>
> This is likely to not be due to internalize itself. Internalize marks
> functions "internal", which allows other interprocedural optimizers to
> have more freedom to change their interfaces etc. The likely problem
> here is that you are calling something from 'main' with mismatching
> calling conventions or something like that. It is hard to say without
> a full testcase.
>
> -Chris
More information about the llvm-dev
mailing list