[LLVMdev] Problems with "module asm"
Sanjiv Gupta
sanjiv.gupta at microchip.com
Mon Jun 29 22:14:07 PDT 2009
This is what the document says:
Module-Level Inline Assembly
Modules may contain "module-level inline asm" blocks, which corresponds
to the GCC "file scope inline asm" blocks. These blocks are internally
concatenated by LLVM and treated as a single unit, but may be separated
in the .ll file if desired. The syntax is very simple:
module asm "inline asm code goes here"
module asm "more can go here"
The strings can contain any character by escaping non-printable
characters. The escape sequence used is simply "\xx" where "xx" is the
two digit hex code for the number.
The inline asm code is simply printed to the machine code .s file when
assembly code is generated.
Here are the problems:
1. clang-cc needs parentheses or else gives errors. So the actual
syntax is
module asm (" blah ");
2. clang-cc gives warnings like
i00202 at ubuntu:/tmp$ cat test.c
module asm ("hello");
module asm ("world");
int main (void) {
}
i00202 at ubuntu:/tmp$ clang-cc -emit-llvm test.c
test.c:1:1: warning: type specifier missing, defaults to 'int'
module asm ("hello");
^
test.c:2:1: warning: type specifier missing, defaults to 'int'
module asm ("world");
^
2 diagnostics generated.
3. The blocks are NOT being concatenated. Below is the generated .ll file.
i00202 at ubuntu:/tmp$ cat test.ll
; ModuleID = 'test.c'
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:64-f80:32:32"
target triple = "i386-pc-linux-gnu"
@"\01world" = common global i32 0, align 4 ; <i32*> [#uses=0]
define i32 @main() nounwind {
entry:
%retval = alloca i32 ; <i32*> [#uses=1]
%0 = load i32* %retval ; <i32> [#uses=1]
ret i32 %0
}
module asm ("hello") is misssing.
More information about the llvm-dev
mailing list