[LLVMdev] Trouble with inline asm

Tomas Lindquist Olsen tomas.l.olsen at gmail.com
Fri Jun 6 06:32:43 PDT 2008


Hi all,

I'm having some trouble with inline asm expressions, more specifically
how to create the right FunctionType for a given constraint set.
So far it has worked well for inputs, but not for outputs. The inline
asm support in this language (which is D, LLVMDC[1]) is through asm
*statements*.
I never have inline asm *expressions*, and outputs are always via memory.

I D my test looks like this:

extern(C) int printf(char*,...);
int main()
{
    int i = 12;
    printf("%d\n", i);
    asm
    {
        mov EAX, i;
        add EAX, EAX;
        mul EAX, 2;
        mov i, EAX; // ***
    }
    printf("%d\n", i);
    return 0;
}

if the *** line is commented I get this LL (unrelevant stuff removed):

; ModuleID = 'tangotests.asm1'
target datalayout =
"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:8"
target triple = "i686-unknown-linux-gnu"

@.stringliteral = internal constant [4 x i8] c"%d\0A\00"
 ; <[4 x i8]*> [#uses=1]

declare i32 @printf(i8*, ...)

define fastcc i32 @_Dmain() {
entry_tangotests.asm1.main:
        %i = alloca i32         ; <i32*> [#uses=4]
        store i32 12, i32* %i
        %tmp = load i32* %i             ; <i32> [#uses=1]
        %tmp1 = call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x
i8]* @.stringliteral, i32 0, i32 0), i32 %tmp )           ; <i32>
[#uses=0]
        %tmp2 = load i32* %i            ; <i32> [#uses=1]
        call void asm sideeffect "movl $0, %eax", "m,~{eax}"( i32 %tmp2 )
        call void asm sideeffect "addl %eax, %eax", "~{eax},~{eax}"( )
        call void asm sideeffect "mull $0", "i,~{eax},~{edx},~{eax}"( i32 2 )
        %tmp3 = load i32* %i            ; <i32> [#uses=1]
        %tmp4 = call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x
i8]* @.stringliteral, i32 0, i32 0), i32 %tmp3 )         ; <i32>
[#uses=0]
        ret i32 0
}



Now... No matter what I try I can't figure out what the function
signature should be for the *** line. I always get the assertion:
        InlineAsm.cpp:43: llvm::InlineAsm::InlineAsm(const
llvm::FunctionType*, const std::string&, const std::string&, bool):
Assertion `Verify(Ty, constraints) && "Function type not legal for
constraints!"' failed.

The inline expr I try to create is like:

        call void asm sideeffect "movl %eax, $0", "=m" (i32* var)

Any clues would be much appreciated! I'd like to say that I'm very new
with this format of assembler, constraints etc.

Thanx, Tomas Lindquist Olsen

[1] : http://www.dsource.org/projects/llvmdc



More information about the llvm-dev mailing list