[LLVMdev] How to use clang -intergrated-as to compile cross-(os/target) assembly file.
Reid Kleckner
rnk at google.com
Tue Oct 22 10:35:38 PDT 2013
I don't think we should attempt to mangle symbols declared in assembly
source files. If you're writing assembly, you will need to handle ABI
portability, including the _ prefix on win32 x86.
clang will run the C preprocessor for you if you use the .S file suffix
(case matters).
On Tue, Oct 22, 2013 at 7:08 AM, 罗勇刚(Yonggang Luo) <luoyonggang at gmail.com>wrote:
> For example, I execute the following command sequences:
>
> H:\CI\bld\compilers\musl\src\math\i386>type sqrt.s
> #.globl _sqrt
> .global sqrt
> #.type sqrt, at function
> #_sqrt:
> sqrt: fldl 4(%esp)
> fsqrt
> fstsw %ax
> sub $12,%esp
> fld %st(0)
> fstpt (%esp)
> mov (%esp),%ecx
> and $0x7ff,%ecx
> cmp $0x400,%ecx
> jnz 1f
> and $0x200,%eax
> sub $0x100,%eax
> sub %eax,(%esp)
> fstp %st(0)
> fldt (%esp)
> 1: add $12,%esp
> fstpl 4(%esp)
> fldl 4(%esp)
> ret
>
> H:\CI\bld\compilers\musl\src\math\i386>type sqrt.c
> float __cdecl sqrt(float z)
> {
> return 0.0;
> }
> H:\CI\bld\compilers\musl\src\math\i386>clang -integrated-as -c -v
> --target=i686
> -pc-win32 sqrt.s
> clang version 3.4 (trunk)
> Target: i686-pc-win32
> Thread model: posix
> "C:\Program Files (x86)\LLVM 3.4.svn\bin\clang.exe" -cc1as -triple
> i686-pc-win3
> 2 -filetype obj -main-file-name sqrt.s -target-cpu pentium4
> -fdebug-compilation-
> dir "H:\\CI\\bld\\compilers\\musl\\src\\math\\i386" -dwarf-debug-producer
> clang
> version 3.4 (trunk) -o sqrt.o sqrt.s
>
> H:\CI\bld\compilers\musl\src\math\i386>llvm-objdump -s -r -t sqrt.o
>
> sqrt.o: file format COFF-i386
>
> Contents of section .text:
> 0000 dd442404 d9fa9bdf e083ec0c d9c0db3c .D$............<
> 0010 248b0c24 81e1ff07 000081f9 00040000 $..$............
> 0020 75122500 0200002d 00010000 290424dd u.%....-....).$.
> 0030 d8db2c24 83c40cdd 5c2404dd 442404c3 ..,$....\$..D$..
> SYMBOL TABLE:
> [ 0](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text
> AUX scnlen 0x40 nreloc 0 nlnno 0 checksum 0x0 assoc 1 comdat 0
> [ 2](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 sqrt
>
> H:\CI\bld\compilers\musl\src\math\i386>clang --target=i686-pc-win32 -c
> sqrt.c
> sqrt.c:1:15: warning: incompatible redeclaration of library function 'sqrt'
> [-Wincompatible-library-redeclaration]
> float __cdecl sqrt(float z)
> ^
> sqrt.c:1:15: note: 'sqrt' is a builtin with type 'double (double)'
> 1 warning generated.
>
> H:\CI\bld\compilers\musl\src\math\i386>llvm-objdump -s -r -t sqrt.o
>
> sqrt.o: file format COFF-i386
>
> Contents of section .text:
> 0000 5589e583 ec08f30f 1045080f 57c9f30f U........E..W...
> 0010 1145fcd9 eef30f11 4df883c4 085dc3 .E......M....].
> SYMBOL TABLE:
> [ 0](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text
> AUX scnlen 0x1f nreloc 0 nlnno 0 checksum 0x0 assoc 1 comdat 0
> [ 2](sec -1)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000001 @feat.00
> [ 3](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _sqrt
>
> H:\CI\bld\compilers\musl\src\math\i386>
> H:\CI\bld\compilers\musl\src\math\i386>clang -integrated-as -c -v
> --target=amd6
> 4-pc-win32 sqrt.s
> clang version 3.4 (trunk)
> Target: amd64-pc-win32
> Thread model: posix
> "C:\Program Files (x86)\LLVM 3.4.svn\bin\clang.exe" -cc1as -triple
> amd64-pc-win
> 32 -filetype obj -main-file-name sqrt.s -target-cpu x86-64
> -fdebug-compilation-d
> ir "H:\\CI\\bld\\compilers\\musl\\src\\math\\i386" -dwarf-debug-producer
> clang v
> ersion 3.4 (trunk) -o sqrt.o sqrt.s
>
> H:\CI\bld\compilers\musl\src\math\i386>llvm-objdump -s -r -t sqrt.o
>
> sqrt.o: file format COFF-x86-64
>
> Contents of section .text:
> 0000 67dd4424 04d9fa9b dfe083ec 0cd9c067 g.D$...........g
> 0010 db3c2467 8b0c2481 e1ff0700 0081f900 .<$g..$.........
> 0020 04000075 14250002 00002d00 01000067 ...u.%....-....g
> 0030 290424dd d867db2c 2483c40c 67dd5c24 ).$..g.,$...g.\$
> 0040 0467dd44 2404c3 .g.D$..
> SYMBOL TABLE:
> [ 0](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text
> AUX scnlen 0x47 nreloc 0 nlnno 0 checksum 0x0 assoc 1 comdat 0
> [ 2](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 sqrt
>
> H:\CI\bld\compilers\musl\src\math\i386>clang --target=amd64-pc-win32 -c
> sqrt.c
> sqrt.c:1:15: warning: incompatible redeclaration of library function 'sqrt'
> [-Wincompatible-library-redeclaration]
> float __cdecl sqrt(float z)
> ^
> sqrt.c:1:15: note: 'sqrt' is a builtin with type 'double (double)'
> 1 warning generated.
>
> H:\CI\bld\compilers\musl\src\math\i386>llvm-objdump -s -r -t sqrt.o
>
> sqrt.o: file format COFF-x86-64
>
> Contents of section .text:
> 0000 554889e5 50f30f11 45fc0f57 c04883c4 UH..P...E..W.H..
> 0010 085dc3 .].
> SYMBOL TABLE:
> [ 0](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text
> AUX scnlen 0x13 nreloc 0 nlnno 0 checksum 0x0 assoc 1 comdat 0
> [ 2](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 sqrt
>
> H:\CI\bld\compilers\musl\src\math\i386>
>
> *
> *
> *My problem is:*
>
> Because C __cdecl calling convention vary on x86/amd64 architecture under
> win32.
> for example, the sqrt function in is expressed as
> float __cdecl sqrt(float)
>
> but in the compiled object file, the final COFF symbol table:
> on x86/win32(i686-pc-win32), it's named with "*_sqrt*"
> on amd64/win32(amd64-pc-win32), it's named with "*sqrt*"
>
>
>
> on linux(*-pc-linux), in ELF symbol table, it's named with "*sqrt*",
>
>
> So I want to control the function name in assembly file, by the means of
> Assembly macros,
> but I don't know LLVM-MC support which kinds of macros to control the
> assembly directives so that I can unified the assembly function name can
> match the c function name in object symbol table under different
> CPU(x86/x64) and different OS(Win32/Linux/MacOS).
> The simplest way is to duplicate the function name is to duplicate the
> function name in two form:
> .globl _sqrt
> .global sqrt
> #.type sqrt, at function
> _sqrt:
> sqrt: fldl 4(%esp)
> But that will leading redundant object symbol name.
> besides, the* .type *didn't support under COFF symbol table, so how did I
> use assembly macro to comment it out when we are targeting COFF object but
> reserved when we are targeting ELF.
> didn't know if Mach-O support for this directive.
>
> --
> 此致
> 礼
> 罗勇刚
> Yours
> sincerely,
> Yonggang Luo
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131022/9855ec3f/attachment.html>
More information about the llvm-dev
mailing list