diff options
Diffstat (limited to 'config/external/ffi')
-rw-r--r-- | config/external/ffi/moz.build | 149 | ||||
-rw-r--r-- | config/external/ffi/preprocess_libffi_asm.py | 25 | ||||
-rw-r--r-- | config/external/ffi/subst_header.py | 32 |
3 files changed, 206 insertions, 0 deletions
diff --git a/config/external/ffi/moz.build b/config/external/ffi/moz.build new file mode 100644 index 0000000000..19c93501c1 --- /dev/null +++ b/config/external/ffi/moz.build @@ -0,0 +1,149 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +FINAL_LIBRARY = "js" + +if CONFIG["MOZ_SYSTEM_FFI"]: + OS_LIBS += CONFIG["MOZ_FFI_LIBS"] +else: + AllowCompilerWarnings() + NoVisibilityFlags() + + CONFIGURE_DEFINE_FILES += [ + "/js/src/ctypes/libffi/fficonfig.h", + ] + LOCAL_INCLUDES += [ + "!/js/src/ctypes/libffi", + "!/js/src/ctypes/libffi/include", + "/js/src/ctypes/libffi/include", + "/js/src/ctypes/libffi/src/%s" % CONFIG["FFI_TARGET_DIR"], + ] + + DEFINES["TARGET"] = CONFIG["FFI_TARGET"] + DEFINES[CONFIG["FFI_TARGET"]] = True + DEFINES["FFI_NO_RAW_API"] = True + DEFINES["FFI_BUILDING"] = True + DEFINES["HAVE_AS_ASCII_PSEUDO_OP"] = True + DEFINES["HAVE_AS_STRING_PSEUDO_OP"] = True + + if CONFIG["MOZ_DEBUG"]: + DEFINES["FFI_DEBUG"] = True + if not CONFIG["MOZ_NO_DEBUG_RTL"]: + DEFINES["USE_DEBUG_RTL"] = True + SOURCES += [ + "/js/src/ctypes/libffi/src/debug.c", + ] + + if CONFIG["OS_TARGET"] != "WINNT": + DEFINES["HAVE_HIDDEN_VISIBILITY_ATTRIBUTE"] = True + + if CONFIG["INTEL_ARCHITECTURE"]: + DEFINES["HAVE_AS_X86_PCREL"] = True + + # Don't bother setting EH_FRAME_FLAGS on Windows. + # Quoted defines confuse msvcc.sh, and the value isn't used there. + if CONFIG["OS_TARGET"] != "WINNT": + if CONFIG["FFI_TARGET"] == "ARM": + DEFINES["EH_FRAME_FLAGS"] = '"aw"' + else: + DEFINES["EH_FRAME_FLAGS"] = '"a"' + + # Common source files. + SOURCES += [ + "/js/src/ctypes/libffi/src/closures.c", + "/js/src/ctypes/libffi/src/java_raw_api.c", + "/js/src/ctypes/libffi/src/prep_cif.c", + "/js/src/ctypes/libffi/src/raw_api.c", + "/js/src/ctypes/libffi/src/types.c", + ] + + # Per-platform sources and flags. + ffi_srcs = () + ffi_h_defines = [] + if CONFIG["FFI_TARGET"] == "X86_WIN64": + if CONFIG["CC_TYPE"] == "clang-cl": + ffi_srcs = ("ffiw64.c",) + # libffi asm needs to be preprocessed for MSVC's assembler + GeneratedFile( + "win64_intel.asm", + inputs=[ + "/js/src/ctypes/libffi/src/x86/win64_intel.S", + "!/js/src/ctypes/libffi/fficonfig.h", + "!/js/src/ctypes/libffi/include/ffi.h", + ], + script="preprocess_libffi_asm.py", + flags=["$(DEFINES)", "$(LOCAL_INCLUDES)"], + ) + SOURCES += ["!win64_intel.asm"] + else: + ffi_srcs = ("ffiw64.c", "win64.S") + + elif CONFIG["FFI_TARGET"] == "X86_64": + DEFINES["HAVE_AS_X86_64_UNWIND_SECTION_TYPE"] = True + ffi_srcs = ("ffi64.c", "unix64.S", "ffiw64.c", "win64.S") + + elif CONFIG["FFI_TARGET"] == "X86_WIN32" and CONFIG["CC_TYPE"] == "clang-cl": + ffi_srcs = ("ffi.c",) + # libffi asm needs to be preprocessed for MSVC's assembler + GeneratedFile( + "sysv_intel.asm", + inputs=[ + "/js/src/ctypes/libffi/src/x86/sysv_intel.S", + "!/js/src/ctypes/libffi/fficonfig.h", + "!/js/src/ctypes/libffi/include/ffi.h", + ], + script="preprocess_libffi_asm.py", + flags=["$(DEFINES)", "$(LOCAL_INCLUDES)"], + ) + SOURCES += ["!sysv_intel.asm"] + ASFLAGS += ["-safeseh"] + + elif CONFIG["FFI_TARGET"] == "ARM_WIN64": + ffi_srcs = ("ffi.c",) + + # libffi asm needs to be preprocessed for MSVC's assembler + GeneratedFile( + "win64_armasm.asm", + inputs=[ + "/js/src/ctypes/libffi/src/aarch64/win64_armasm.S", + "!/js/src/ctypes/libffi/fficonfig.h", + "!/js/src/ctypes/libffi/include/ffi.h", + ], + script="preprocess_libffi_asm.py", + flags=["$(DEFINES)", "$(LOCAL_INCLUDES)"], + ) + SOURCES += ["!win64_armasm.asm"] + + else: + ffi_srcs = ("ffi.c", "sysv.S") + + if CONFIG["FFI_TARGET"] in ("X86_WIN32", "X86_DARWIN") and CONFIG["CC_TYPE"] in ( + "gcc", + "clang", + ): + DEFINES["SYMBOL_UNDERSCORE"] = True + + if CONFIG["OS_ARCH"] == "Darwin" and CONFIG["CPU_ARCH"] in ("arm", "aarch64"): + DEFINES["FFI_EXEC_TRAMPOLINE_TABLE"] = True + ffi_h_defines.append("FFI_EXEC_TRAMPOLINE_TABLE") + + elif ( + CONFIG["OS_ARCH"] in ("Darwin", "FreeBSD", "GNU_kFreeBSD", "OpenBSD", "SunOS") + or CONFIG["OS_TARGET"] == "Android" + ): + DEFINES["FFI_MMAP_EXEC_WRIT"] = True + + SOURCES += [ + "/js/src/ctypes/libffi/src/%s/%s" % (CONFIG["FFI_TARGET_DIR"], s) + for s in sorted(ffi_srcs) + ] + + GeneratedFile( + "/js/src/ctypes/libffi/include/ffi.h", + script="subst_header.py", + inputs=["/js/src/ctypes/libffi/include/ffi.h.in"], + flags=ffi_h_defines, + ) diff --git a/config/external/ffi/preprocess_libffi_asm.py b/config/external/ffi/preprocess_libffi_asm.py new file mode 100644 index 0000000000..4808c3a7e4 --- /dev/null +++ b/config/external/ffi/preprocess_libffi_asm.py @@ -0,0 +1,25 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Souce Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distibuted with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +import shlex +import subprocess + +import buildconfig +import mozpack.path as mozpath + + +def main(output, input_asm, ffi_h, ffi_config_h, defines, includes): + defines = shlex.split(defines) + includes = shlex.split(includes) + # CPP uses -E which generates #line directives. -EP suppresses them. + # -TC forces the compiler to treat the input as C. + cpp = buildconfig.substs["CPP"] + ["-EP"] + ["-TC"] + input_asm = mozpath.relpath(input_asm, os.getcwd()) + args = cpp + defines + includes + [input_asm] + print(" ".join(args)) + preprocessed = subprocess.check_output(args) + output.write(preprocessed) diff --git a/config/external/ffi/subst_header.py b/config/external/ffi/subst_header.py new file mode 100644 index 0000000000..e1448ff889 --- /dev/null +++ b/config/external/ffi/subst_header.py @@ -0,0 +1,32 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Souce Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distibuted with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import sys + +import buildconfig +from mozbuild.preprocessor import Preprocessor + + +def main(output, input_file, *defines): + pp = Preprocessor() + pp.context.update( + { + "FFI_EXEC_TRAMPOLINE_TABLE": "0", + "HAVE_LONG_DOUBLE": "0", + "TARGET": buildconfig.substs["FFI_TARGET"], + "VERSION": "", + } + ) + for d in defines: + pp.context.update({d: "1"}) + pp.do_filter("substitution") + pp.setMarker(None) + pp.out = output + pp.do_include(input_file) + + +if __name__ == "__main__": + main(*sys.agv[1:]) |