aboutsummaryrefslogtreecommitdiffstats
path: root/meson/test cases/common/118 llvm ir and assembly
diff options
context:
space:
mode:
authorAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
committerAngelos Mouzakitis <a.mouzakitis@virtualopensystems.com>2023-10-10 14:33:42 +0000
commitaf1a266670d040d2f4083ff309d732d648afba2a (patch)
tree2fc46203448ddcc6f81546d379abfaeb323575e9 /meson/test cases/common/118 llvm ir and assembly
parente02cda008591317b1625707ff8e115a4841aa889 (diff)
Add submodule dependency filesHEADmaster
Change-Id: Iaf8d18082d3991dec7c0ebbea540f092188eb4ec
Diffstat (limited to 'meson/test cases/common/118 llvm ir and assembly')
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/main.c13
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/main.cpp15
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/meson.build79
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/square-aarch64.S29
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/square-arm.S29
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/square-x86.S36
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/square-x86_64.S37
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/square.ll4
-rw-r--r--meson/test cases/common/118 llvm ir and assembly/symbol-underscore.h5
9 files changed, 247 insertions, 0 deletions
diff --git a/meson/test cases/common/118 llvm ir and assembly/main.c b/meson/test cases/common/118 llvm ir and assembly/main.c
new file mode 100644
index 000000000..35e8ed623
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/main.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+
+unsigned square_unsigned (unsigned a);
+
+int main(void)
+{
+ unsigned int ret = square_unsigned (2);
+ if (ret != 4) {
+ printf("Got %u instead of 4\n", ret);
+ return 1;
+ }
+ return 0;
+}
diff --git a/meson/test cases/common/118 llvm ir and assembly/main.cpp b/meson/test cases/common/118 llvm ir and assembly/main.cpp
new file mode 100644
index 000000000..aac3cbfef
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/main.cpp
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+extern "C" {
+ unsigned square_unsigned (unsigned a);
+}
+
+int main (void)
+{
+ unsigned int ret = square_unsigned (2);
+ if (ret != 4) {
+ printf("Got %u instead of 4\n", ret);
+ return 1;
+ }
+ return 0;
+}
diff --git a/meson/test cases/common/118 llvm ir and assembly/meson.build b/meson/test cases/common/118 llvm ir and assembly/meson.build
new file mode 100644
index 000000000..2aec7f07f
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/meson.build
@@ -0,0 +1,79 @@
+project('llvm-ir', 'c', 'cpp')
+
+if meson.backend() == 'xcode'
+ error('MESON_SKIP_TEST: asm not supported with the Xcode backend. Patches welcome.')
+endif
+
+cpu = host_machine.cpu_family()
+supported_cpus = ['arm', 'aarch64', 'x86', 'x86_64']
+
+foreach lang : ['c', 'cpp']
+ cc = meson.get_compiler(lang)
+ cc_id = cc.get_id()
+ ## Build a trivial executable 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
+ ## 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
+ 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 ml.exe or armasm.exe
+ # assembler. Then we can link it into the executable.
+ if cc.get_argument_syntax() == 'msvc'
+ cl = cc.cmd_array()
+ if cpu == 'x86'
+ asmcmd = 'ml'
+ elif cpu == 'x86_64'
+ asmcmd = 'ml64'
+ elif cpu == 'aarch64'
+ asmcmd = 'armasm64'
+ elif cpu == 'arm'
+ asmcmd = 'armasm'
+ else
+ error('Unsupported cpu family: "' + cpu + '"')
+ endif
+ ml = find_program(asmcmd, required: false)
+ if not ml.found()
+ error('MESON_SKIP_TEST: Microsoft assembler (ml/armasm) not found')
+ endif
+ # Preprocess file (ml doesn't support pre-processing)
+ # Force the intput to be C (/Tc) because ICL otherwise assumes it's an object (.obj) file
+ preproc_name = lang + square_base + '.i'
+ square_preproc = custom_target(lang + square_impl + 'preproc',
+ input : square_impl,
+ output : preproc_name,
+ command : [cl, '/nologo', '/EP', '/P', '/Fi' + preproc_name, '/Tc', '@INPUT@'] + uscore_args)
+ # Use assembled object file instead of the original .S assembly source
+ if asmcmd.startswith('armasm')
+ square_impl = custom_target(lang + square_impl,
+ input : square_preproc,
+ output : lang + square_base + '.obj',
+ command : [ml, '-nologo', '-o', '@OUTPUT@', '@INPUT@'])
+ else
+ square_impl = custom_target(lang + square_impl,
+ input : square_preproc,
+ output : lang + square_base + '.obj',
+ command : [ml, '/nologo', '/safeseh', '/Fo', '@OUTPUT@', '/c', '@INPUT@'])
+ endif
+ endif
+ if supported_cpus.contains(cpu)
+ e = executable('square_asm_' + lang, square_impl, 'main.' + lang,
+ c_args : uscore_args, cpp_args : uscore_args)
+ test('test ASM square' + lang, e)
+ elif cc_id != 'clang'
+ error('MESON_SKIP_TEST: Unsupported cpu: "' + cpu + '", and LLVM not found')
+ endif
+endforeach
diff --git a/meson/test cases/common/118 llvm ir and assembly/square-aarch64.S b/meson/test cases/common/118 llvm ir and assembly/square-aarch64.S
new file mode 100644
index 000000000..02f1a1299
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/square-aarch64.S
@@ -0,0 +1,29 @@
+#include "symbol-underscore.h"
+
+#ifdef _MSC_VER
+
+ AREA _TEXT, ARM64, CODE, READONLY
+
+ EXPORT SYMBOL_NAME(square_unsigned)
+SYMBOL_NAME(square_unsigned) PROC
+ mul x1, x0, x0
+ mov x0, x1
+ ret
+SYMBOL_NAME(square_unsigned) ENDP
+
+ END
+
+#else
+
+.text
+.globl SYMBOL_NAME(square_unsigned)
+# ifdef __linux__
+.type square_unsigned, %function
+#endif
+
+SYMBOL_NAME(square_unsigned):
+ mul x1, x0, x0
+ mov x0, x1
+ ret
+
+#endif
diff --git a/meson/test cases/common/118 llvm ir and assembly/square-arm.S b/meson/test cases/common/118 llvm ir and assembly/square-arm.S
new file mode 100644
index 000000000..aea3f1f61
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/square-arm.S
@@ -0,0 +1,29 @@
+#include "symbol-underscore.h"
+
+#ifdef _MSC_VER
+
+ AREA _TEXT, ARM, CODE, READONLY
+
+ EXPORT SYMBOL_NAME(square_unsigned)
+SYMBOL_NAME(square_unsigned) PROC
+ mul r1, r0, r0
+ mov r0, r1
+ mov pc, lr
+SYMBOL_NAME(square_unsigned) ENDP
+
+ END
+
+#else
+
+.text
+.globl SYMBOL_NAME(square_unsigned)
+# ifdef __linux__
+.type square_unsigned, %function
+#endif
+
+SYMBOL_NAME(square_unsigned):
+ mul r1, r0, r0
+ mov r0, r1
+ mov pc, lr
+
+#endif
diff --git a/meson/test cases/common/118 llvm ir and assembly/square-x86.S b/meson/test cases/common/118 llvm ir and assembly/square-x86.S
new file mode 100644
index 000000000..18284c1a6
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/square-x86.S
@@ -0,0 +1,36 @@
+#include "symbol-underscore.h"
+
+/* This sadly doesn't test the symbol underscore stuff. I can't figure out how
+ * to not use an automatic stdcall mechanism and do everything manually. */
+#ifdef _MSC_VER
+
+.386
+.MODEL FLAT, C
+
+PUBLIC square_unsigned
+_TEXT SEGMENT
+
+square_unsigned PROC var1:DWORD
+ mov eax, var1
+ imul eax, eax
+ ret
+
+square_unsigned ENDP
+
+_TEXT ENDS
+END
+
+#else
+
+.text
+.globl SYMBOL_NAME(square_unsigned)
+# ifdef __linux__
+.type square_unsigned, %function
+#endif
+
+SYMBOL_NAME(square_unsigned):
+ movl 4(%esp), %eax
+ imull %eax, %eax
+ retl
+
+#endif
diff --git a/meson/test cases/common/118 llvm ir and assembly/square-x86_64.S b/meson/test cases/common/118 llvm ir and assembly/square-x86_64.S
new file mode 100644
index 000000000..5678d00a3
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/square-x86_64.S
@@ -0,0 +1,37 @@
+#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 __linux__
+.type square_unsigned, %function
+#endif
+
+# if defined(_WIN32) || defined(__CYGWIN__) /* msabi */
+SYMBOL_NAME(square_unsigned):
+ imull %ecx, %ecx
+ movl %ecx, %eax
+ retq
+# else /* sysvabi */
+SYMBOL_NAME(square_unsigned):
+ imull %edi, %edi
+ movl %edi, %eax
+ retq
+# endif
+
+#endif
diff --git a/meson/test cases/common/118 llvm ir and assembly/square.ll b/meson/test cases/common/118 llvm ir and assembly/square.ll
new file mode 100644
index 000000000..7c321aa82
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/square.ll
@@ -0,0 +1,4 @@
+define i32 @square_unsigned(i32 %a) {
+ %1 = mul i32 %a, %a
+ ret i32 %1
+}
diff --git a/meson/test cases/common/118 llvm ir and assembly/symbol-underscore.h b/meson/test cases/common/118 llvm ir and assembly/symbol-underscore.h
new file mode 100644
index 000000000..d0f3ef9cc
--- /dev/null
+++ b/meson/test cases/common/118 llvm ir and assembly/symbol-underscore.h
@@ -0,0 +1,5 @@
+#if defined(MESON_TEST__UNDERSCORE_SYMBOL)
+# define SYMBOL_NAME(name) _##name
+#else
+# define SYMBOL_NAME(name) name
+#endif