[llvm-dev] ThinLTO: module-scope inline assembly blocks

Teresa Johnson via llvm-dev llvm-dev at lists.llvm.org
Mon Oct 3 07:27:16 PDT 2016


On Mon, Oct 3, 2016 at 6:53 AM, Johan Engelen via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Hi all,
>   I am trying to add ThinLTO to the LDC compiler. It seems to work well on
> Mac (XCode 8) and Ubuntu (ld.gold + LLVMgold plugin).
> However, I am running into trouble with module-scope inline assembly
> blocks.
>

Are you adding the support using the new LTO API or using the libLTO C
interfaces?


>
> I have a module ASM with a function `foo` defined in an inline assembly
> block (and an LLVM IR `declare @foo()` for it). There is also a "normal"
> function `void simplefunction()` defined in the module.
> ```
> module asm "\09.text"
> module asm "\09.globl\09foo"
> module asm "\09.align\0916, 0x90"
> module asm "\09.type\09foo, at function"
> module asm "foo:"
> module asm "\09movq %rdi, %rax"
> module asm "\09rorw $8, %ax"
> module asm "\09ret "
> module asm "\09.size\09foo, .-foo"
> module asm ""
>
> declare zeroext i16 @foo(i16 zeroext) #0
>
> define i32 @_simplefunction() #1 {
>   ret i32 1
> }
> ```
>
> Another module MAIN contains a function that calls ASM's
> `simplefunction()`.
> ```
> define i32 @_Dmain({ i64, { i64, i8* }* } %unnamed) #0 {
>   %1 = call i32 @_simplefunction() #1
>   ret i32 %1
> }
> declare i32 @_simplefunction() #1
> ```
>
> Then these two modules are passed to the linker, using ThinLTO, thus
> bitcode files with .o extension and module summaries added. The linker
> reports a multiple definition error for the inline assembly function.
> (note that `foo` is not called anywhere)
>
> I suspect that when ThinLTO decides to import a function from another
> module for inlining, the other module's module-scope assembly blocks are
> also imported, which later result in the multiple definition problems.
>
> My question: is this known, intended, or otherwise broken on _my_ end? Or
> perhaps is it a bug and importing from modules with module-scope assembly
> should be disabled / should not import the module-scope asm?
>
> (I can "fix" things on my end by disabling ThinLTO when there is a
> module-scope asm block, but perhaps there should be a proper fix in LLVM)
>

I think this should just work, since module-level assembly is parsed when
reading bitcode, and if the global foo is imported it should end up with
available_externally linkage which would cause the def to be dropped if it
wasn't inlined. Not sure what is going wrong.

Is there a save-temps option for the LDC linker that you could dump the IR
after importing? With the new LTO API you can use the Config::addSaveTemps
function to enable this. With the old LTO support used by libLTO there is
an addSaveTempsDir on ThinLTOCodeGenerator, which looks like it can be set
via thinlto_codegen_set_savetemps_dir.

Teresa


Thanks!
>
> Cheers,
>   Johan
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>


-- 
Teresa Johnson |  Software Engineer |  tejohnson at google.com |  408-460-2413
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161003/e6b64099/attachment.html>


More information about the llvm-dev mailing list