Also add MSVC support while doing so. Doesn't test 32-bit Windows yet because I can't figure out how to do manual setup for function calls on Win32 which also does symbol mangling. But this is fine for now.pull/1184/head
parent
4967b2a5ea
commit
3e2d894f55
4 changed files with 94 additions and 9 deletions
@ -1,17 +1,54 @@ |
||||
project('llvm-ir', 'c', 'cpp') |
||||
|
||||
foreach lang : ['c', 'cpp'] |
||||
cc_id = meson.get_compiler(lang).get_id() |
||||
cc = meson.get_compiler(lang) |
||||
cc_id = cc.get_id() |
||||
## Build a trivial executale with mixed LLVM IR source |
||||
if cc_id == 'clang' |
||||
e = executable('square_ir_' + lang, 'square.ll', 'main.' + lang) |
||||
test('test IR square' + lang, e) |
||||
endif |
||||
# FIXME: msvc does not support passing assembly to cl.exe, but you can pass |
||||
# it to ml.exe and get a compiled object. Meson should add support for |
||||
# transparently building assembly with ml.exe with MSVC. |
||||
if cc_id != 'msvc' |
||||
cpu = host_machine.cpu_family() |
||||
e = executable('square_asm_' + lang, 'square-' + cpu + '.S', 'main.' + lang) |
||||
test('test ASM square' + lang, e, args : [e.full_path()]) |
||||
## Build a trivial executable with mixed assembly source |
||||
# This also helps test whether cc.symbols_have_underscore_prefix() is working |
||||
# properly. This is done by assembling some assembly into an object that will |
||||
# provide the unsigned_squared() symbol to main.c/cpp. This requires the |
||||
# C symbol mangling to be known in advance. |
||||
if cc.symbols_have_underscore_prefix() |
||||
uscore_args = ['-DMESON_TEST__UNDERSCORE_SYMBOL'] |
||||
message('underscore is prefixed') |
||||
else |
||||
uscore_args = [] |
||||
message('underscore is NOT prefixed') |
||||
endif |
||||
cpu = host_machine.cpu_family() |
||||
square_base = 'square-' + cpu |
||||
square_impl = square_base + '.S' |
||||
# MSVC cannot directly compile assembly files, so we pass it through the |
||||
# cl.exe pre-processor first and then assemble it with the ml.exe assembler. |
||||
# Then we can link it into the executable. |
||||
if cc_id == 'msvc' |
||||
cl = find_program('cl') |
||||
if cpu == 'x86' |
||||
ml = find_program('ml') |
||||
elif cpu == 'x86_64' |
||||
ml = find_program('ml64') |
||||
else |
||||
error('Unsupported cpu family: "' + cpu + '"') |
||||
endif |
||||
# Preprocess file (ml doesn't support pre-processing) |
||||
preproc_name = lang + square_base + '.i' |
||||
square_preproc = custom_target(lang + square_impl + 'preproc', |
||||
input : square_impl, |
||||
output : preproc_name, |
||||
command : [cl, '/EP', '/P', '/Fi' + preproc_name, '@INPUT@'] + uscore_args) |
||||
# Use assembled object file instead of the original .S assembly source |
||||
square_impl = custom_target(lang + square_impl, |
||||
input : square_preproc, |
||||
output : lang + square_base + '.obj', |
||||
command : [ml, '/Fo', '@OUTPUT@', '/c', '@INPUT@']) |
||||
|
||||
endif |
||||
e = executable('square_asm_' + lang, square_impl, 'main.' + lang, |
||||
c_args : uscore_args, cpp_args : uscore_args) |
||||
test('test ASM square' + lang, e) |
||||
endforeach |
||||
|
@ -1,9 +1,34 @@ |
||||
#include "symbol-underscore.h" |
||||
|
||||
#ifdef _MSC_VER /* MSVC on Windows */ |
||||
|
||||
PUBLIC SYMBOL_NAME(square_unsigned) |
||||
_TEXT SEGMENT |
||||
|
||||
SYMBOL_NAME(square_unsigned) PROC |
||||
mov eax, ecx |
||||
imul eax, eax |
||||
ret |
||||
SYMBOL_NAME(square_unsigned) ENDP |
||||
|
||||
_TEXT ENDS |
||||
END |
||||
|
||||
#else |
||||
|
||||
.text |
||||
.globl SYMBOL_NAME(square_unsigned) |
||||
|
||||
# ifdef _WIN32 /* MinGW */ |
||||
SYMBOL_NAME(square_unsigned): |
||||
imull %ecx, %ecx |
||||
movl %ecx, %eax |
||||
retq |
||||
# else /* Linux and OS X */ |
||||
SYMBOL_NAME(square_unsigned): |
||||
imull %edi, %edi |
||||
movl %edi, %eax |
||||
retq |
||||
# endif |
||||
|
||||
#endif |
||||
|
Loading…
Reference in new issue