ref: 94be01301881f1062f56549f4612305cc8fb0407
parent: 3cbdb84fd048410e59e6facde7b46409f2096296
author: Martin Storsjö <martin@martin.st>
date: Wed Sep 16 19:53:11 EDT 2020
meson: Fix building for arm/aarch64 mingw (with clang) For aarch64, gas-preprocessor isn't needed at all. This requires changing all the if statements surrounding the use of asm_gen for aarch64. For arm, gas-preprocessor is needed, but can be invoked differently to produce code that clang can assemble, instead of armasm.
--- a/codec/common/meson.build
+++ b/codec/common/meson.build
@@ -40,7 +40,7 @@
'arm/intra_pred_common_neon.S',
'arm/mc_neon.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
@@ -53,7 +53,7 @@
'arm64/intra_pred_common_aarch64_neon.S',
'arm64/mc_aarch64_neon.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
--- a/codec/decoder/meson.build
+++ b/codec/decoder/meson.build
@@ -34,7 +34,7 @@
'core/arm/block_add_neon.S',
'core/arm/intra_pred_neon.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
@@ -44,7 +44,7 @@
'core/arm64/block_add_aarch64_neon.S',
'core/arm64/intra_pred_aarch64_neon.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
--- a/codec/encoder/meson.build
+++ b/codec/encoder/meson.build
@@ -55,7 +55,7 @@
'core/arm/reconstruct_neon.S',
'core/arm/svc_motion_estimation.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
@@ -69,7 +69,7 @@
'core/arm64/reconstruct_aarch64_neon.S',
'core/arm64/svc_motion_estimation_aarch64_neon.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
--- a/codec/processing/meson.build
+++ b/codec/processing/meson.build
@@ -33,7 +33,7 @@
'src/arm/pixel_sad_neon.S',
'src/arm/vaa_calc_neon.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
@@ -45,7 +45,7 @@
'src/arm64/pixel_sad_aarch64_neon.S',
'src/arm64/vaa_calc_aarch64_neon.S',
]
- if system == 'windows'
+ if use_asm_gen
objs_asm = asm_gen.process(asm_sources)
else
cpp_sources += asm_sources
--- a/meson.build
+++ b/meson.build
@@ -106,16 +106,17 @@
asm_args += ['-DWIN64']
asm_inc = join_paths(meson.current_source_dir(), 'codec', 'common', 'x86', '')
elif cpu_family == 'arm'
- if cpp.get_argument_syntax() != 'msvc'
- error('Windows ARM is currently only supported with Visual Studio-like compilers')
+ if cpp.get_argument_syntax() == 'msvc'
+ asm_format = 'armasm'
+ asm_args += ['-nologo', '-DHAVE_NEON', '-ignore', '4509']
+ asm_cmds = ['armasm']
+ else
+ asm_format = 'clang'
+ asm_args += ['-DHAVE_NEON', '-mimplicit-it=always']
+ asm_cmds = cpp.cmd_array()
endif
- asm_format = 'armasm'
- asm_args += ['-nologo', '-DHAVE_NEON', '-ignore', '4509']
asm_inc = join_paths(meson.current_source_dir(), 'codec', 'common', 'arm', '')
elif cpu_family == 'aarch64'
- if cpp.get_argument_syntax() != 'msvc'
- error('Windows ARM64 is currently only supported with Visual Studio-like compilers')
- endif
asm_format = 'armasm'
asm_args += ['-nologo', '-DHAVE_NEON_AARCH64']
asm_inc = join_paths(meson.current_source_dir(), 'codec', 'common', 'arm64', '')
@@ -126,9 +127,11 @@
error('FIXME: Unhandled system @0@'.format(system))
endif
+use_asm_gen = false
if cpu_family in ['x86', 'x86_64']
nasm = find_program('nasm')
+ use_asm_gen = true
asm_gen = generator(nasm,
output : '@BASENAME@.o',
arguments : [
@@ -137,29 +140,38 @@
'@INPUT@',
'-o', '@OUTPUT@'] + asm_args)
elif system == 'windows'
- gasprep = find_program('gas-preprocessor.pl')
if cpu_family == 'arm'
+ # For ARM, gas-preprocessor is needed for converting the asm to be
+ # buildable as thumb even with Clang.
+ use_asm_gen = true
+ gasprep = find_program('gas-preprocessor.pl')
asm_gen = generator(gasprep,
output : '@BASENAME@.obj',
arguments : [
'-as-type', asm_format,
'-force-thumb',
- '--',
- 'armasm',
+ '--'
+ ] + asm_cmds + [
'-I' + asm_inc] + asm_args + [
'@INPUT@',
'-c', '-o', '@OUTPUT@'])
elif cpu_family == 'aarch64'
- asm_gen = generator(gasprep,
- output : '@BASENAME@.obj',
- arguments : [
- '-as-type', asm_format,
- '-arch', 'aarch64',
- '--',
- 'armasm64',
- '-I' + asm_inc] + asm_args + [
- '@INPUT@',
- '-c', '-o', '@OUTPUT@'])
+ # For ARM64, Clang can build the assembly as-is without needing to use
+ # either gas-preprocessor or armasm64.
+ if cpp.get_argument_syntax() == 'msvc'
+ use_asm_gen = true
+ gasprep = find_program('gas-preprocessor.pl')
+ asm_gen = generator(gasprep,
+ output : '@BASENAME@.obj',
+ arguments : [
+ '-as-type', asm_format,
+ '-arch', 'aarch64',
+ '--',
+ 'armasm64',
+ '-I' + asm_inc] + asm_args + [
+ '@INPUT@',
+ '-c', '-o', '@OUTPUT@'])
+ endif
else
# Windows only supports x86, x86_64, arm, arm64
error('unreachable code')