1*03ce13f7SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*03ce13f7SAndroid Build Coastguard Worker 3*03ce13f7SAndroid Build Coastguard Worker# Copyright 2018 The SwiftShader Authors. All Rights Reserved. 4*03ce13f7SAndroid Build Coastguard Worker# 5*03ce13f7SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*03ce13f7SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*03ce13f7SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*03ce13f7SAndroid Build Coastguard Worker# 9*03ce13f7SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*03ce13f7SAndroid Build Coastguard Worker# 11*03ce13f7SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*03ce13f7SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*03ce13f7SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*03ce13f7SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*03ce13f7SAndroid Build Coastguard Worker# limitations under the License. 16*03ce13f7SAndroid Build Coastguard Worker 17*03ce13f7SAndroid Build Coastguard Workerimport argparse 18*03ce13f7SAndroid Build Coastguard Workerimport contextlib 19*03ce13f7SAndroid Build Coastguard Workerimport multiprocessing 20*03ce13f7SAndroid Build Coastguard Workerimport os 21*03ce13f7SAndroid Build Coastguard Workerimport platform 22*03ce13f7SAndroid Build Coastguard Workerimport re 23*03ce13f7SAndroid Build Coastguard Workerimport shutil 24*03ce13f7SAndroid Build Coastguard Workerimport subprocess 25*03ce13f7SAndroid Build Coastguard Workerimport sys 26*03ce13f7SAndroid Build Coastguard Workerimport tempfile 27*03ce13f7SAndroid Build Coastguard Workerfrom os import path 28*03ce13f7SAndroid Build Coastguard Worker 29*03ce13f7SAndroid Build Coastguard Worker# LLVM_BRANCH must match the value of the same variable in third_party/update-llvm-10.sh 30*03ce13f7SAndroid Build Coastguard WorkerLLVM_BRANCH = "release/10.x" 31*03ce13f7SAndroid Build Coastguard Worker 32*03ce13f7SAndroid Build Coastguard Worker# LLVM_COMMIT must be set to the commit hash that we last updated to when running third_party/update-llvm-10.sh. 33*03ce13f7SAndroid Build Coastguard Worker# Run 'git show -s origin/llvm10-clean' and look for 'llvm-10-update: <hash>' to retrieve it. 34*03ce13f7SAndroid Build Coastguard WorkerLLVM_COMMIT = "d32170dbd5b0d54436537b6b75beaf44324e0c28" 35*03ce13f7SAndroid Build Coastguard Worker 36*03ce13f7SAndroid Build Coastguard WorkerSCRIPT_DIR = path.dirname(path.realpath(sys.argv[0])) 37*03ce13f7SAndroid Build Coastguard WorkerLLVM_STAGING_DIR = path.abspath(path.join(tempfile.gettempdir(), "llvm-10")) 38*03ce13f7SAndroid Build Coastguard WorkerLLVM_DIR = path.abspath(path.join(LLVM_STAGING_DIR, "llvm")) 39*03ce13f7SAndroid Build Coastguard WorkerLLVM_OBJS = path.join(LLVM_STAGING_DIR, "build") 40*03ce13f7SAndroid Build Coastguard WorkerLLVM_CONFIGS = path.abspath(path.join(SCRIPT_DIR, '..', 'configs')) 41*03ce13f7SAndroid Build Coastguard Worker 42*03ce13f7SAndroid Build Coastguard Worker# List of all arches SwiftShader supports 43*03ce13f7SAndroid Build Coastguard WorkerLLVM_TARGETS = [ 44*03ce13f7SAndroid Build Coastguard Worker ('AArch64', ('__aarch64__',)), 45*03ce13f7SAndroid Build Coastguard Worker ('ARM', ('__arm__',)), 46*03ce13f7SAndroid Build Coastguard Worker ('X86', ('__i386__', '__x86_64__')), 47*03ce13f7SAndroid Build Coastguard Worker ('Mips', ('__mips__',)), 48*03ce13f7SAndroid Build Coastguard Worker ('PowerPC', ('__powerpc64__',)), 49*03ce13f7SAndroid Build Coastguard Worker ('RISCV', ('__riscv',)), 50*03ce13f7SAndroid Build Coastguard Worker] 51*03ce13f7SAndroid Build Coastguard Worker 52*03ce13f7SAndroid Build Coastguard Worker# Per-platform arches 53*03ce13f7SAndroid Build Coastguard WorkerLLVM_TRIPLES = { 54*03ce13f7SAndroid Build Coastguard Worker 'android': [ 55*03ce13f7SAndroid Build Coastguard Worker ('__x86_64__', 'x86_64-linux-android'), 56*03ce13f7SAndroid Build Coastguard Worker ('__i386__', 'i686-linux-android'), 57*03ce13f7SAndroid Build Coastguard Worker ('__arm__', 'armv7-linux-androideabi'), 58*03ce13f7SAndroid Build Coastguard Worker ('__aarch64__', 'aarch64-linux-android'), 59*03ce13f7SAndroid Build Coastguard Worker ], 60*03ce13f7SAndroid Build Coastguard Worker 'linux': [ 61*03ce13f7SAndroid Build Coastguard Worker ('__x86_64__', 'x86_64-unknown-linux-gnu'), 62*03ce13f7SAndroid Build Coastguard Worker ('__i386__', 'i686-pc-linux-gnu'), 63*03ce13f7SAndroid Build Coastguard Worker ('__arm__', 'armv7-linux-gnueabihf'), 64*03ce13f7SAndroid Build Coastguard Worker ('__aarch64__', 'aarch64-linux-gnu'), 65*03ce13f7SAndroid Build Coastguard Worker ('__mips__', 'mipsel-linux-gnu'), 66*03ce13f7SAndroid Build Coastguard Worker ('__mips64', 'mips64el-linux-gnuabi64'), 67*03ce13f7SAndroid Build Coastguard Worker ('__powerpc64__', 'powerpc64le-unknown-linux-gnu'), 68*03ce13f7SAndroid Build Coastguard Worker ('__riscv', 'riscv64-unknown-linux-gnu'), 69*03ce13f7SAndroid Build Coastguard Worker ], 70*03ce13f7SAndroid Build Coastguard Worker 'darwin': [ 71*03ce13f7SAndroid Build Coastguard Worker ('__x86_64__', 'x86_64-apple-darwin'), 72*03ce13f7SAndroid Build Coastguard Worker ('__aarch64__', 'arm64-apple-darwin'), 73*03ce13f7SAndroid Build Coastguard Worker ], 74*03ce13f7SAndroid Build Coastguard Worker 'windows': [ 75*03ce13f7SAndroid Build Coastguard Worker ('__x86_64__', 'x86_64-pc-win32'), 76*03ce13f7SAndroid Build Coastguard Worker ('__i386__', 'i686-pc-win32'), 77*03ce13f7SAndroid Build Coastguard Worker ('__arm__', 'armv7-pc-win32'), 78*03ce13f7SAndroid Build Coastguard Worker ('__aarch64__', 'aarch64-pc-win32'), 79*03ce13f7SAndroid Build Coastguard Worker ('__mips__', 'mipsel-pc-win32'), 80*03ce13f7SAndroid Build Coastguard Worker ('__mips64', 'mips64el-pc-win32'), 81*03ce13f7SAndroid Build Coastguard Worker ], 82*03ce13f7SAndroid Build Coastguard Worker 'fuchsia': [ 83*03ce13f7SAndroid Build Coastguard Worker ('__x86_64__', 'x86_64-unknown-fuchsia'), 84*03ce13f7SAndroid Build Coastguard Worker ('__aarch64__', 'aarch64-unknown-fuchsia'), 85*03ce13f7SAndroid Build Coastguard Worker ] 86*03ce13f7SAndroid Build Coastguard Worker} 87*03ce13f7SAndroid Build Coastguard Worker 88*03ce13f7SAndroid Build Coastguard Worker# Mapping of target platform to the host it must be built on 89*03ce13f7SAndroid Build Coastguard WorkerLLVM_PLATFORM_TO_HOST_SYSTEM = { 90*03ce13f7SAndroid Build Coastguard Worker 'android': 'Linux', 91*03ce13f7SAndroid Build Coastguard Worker 'darwin': 'Darwin', 92*03ce13f7SAndroid Build Coastguard Worker 'linux': 'Linux', 93*03ce13f7SAndroid Build Coastguard Worker 'windows': 'Windows', 94*03ce13f7SAndroid Build Coastguard Worker 'fuchsia': 'Linux' 95*03ce13f7SAndroid Build Coastguard Worker} 96*03ce13f7SAndroid Build Coastguard Worker 97*03ce13f7SAndroid Build Coastguard Worker# LLVM configurations to be undefined. 98*03ce13f7SAndroid Build Coastguard WorkerLLVM_UNDEF_MACROS = [ 99*03ce13f7SAndroid Build Coastguard Worker 'BACKTRACE_HEADER', 100*03ce13f7SAndroid Build Coastguard Worker 'ENABLE_BACKTRACES', 101*03ce13f7SAndroid Build Coastguard Worker 'ENABLE_CRASH_OVERRIDES', 102*03ce13f7SAndroid Build Coastguard Worker 'HAVE_BACKTRACE', 103*03ce13f7SAndroid Build Coastguard Worker 'HAVE_POSIX_SPAWN', 104*03ce13f7SAndroid Build Coastguard Worker 'HAVE_PTHREAD_GETNAME_NP', 105*03ce13f7SAndroid Build Coastguard Worker 'HAVE_PTHREAD_SETNAME_NP', 106*03ce13f7SAndroid Build Coastguard Worker 'HAVE_TERMIOS_H', 107*03ce13f7SAndroid Build Coastguard Worker 'HAVE_ZLIB_H', 108*03ce13f7SAndroid Build Coastguard Worker 'HAVE__UNWIND_BACKTRACE', 109*03ce13f7SAndroid Build Coastguard Worker] 110*03ce13f7SAndroid Build Coastguard Worker 111*03ce13f7SAndroid Build Coastguard Worker# General CMake options for building LLVM 112*03ce13f7SAndroid Build Coastguard WorkerLLVM_CMAKE_OPTIONS = [ 113*03ce13f7SAndroid Build Coastguard Worker '-DCMAKE_BUILD_TYPE=Release', 114*03ce13f7SAndroid Build Coastguard Worker '-DLLVM_ENABLE_THREADS=ON', 115*03ce13f7SAndroid Build Coastguard Worker '-DLLVM_ENABLE_TERMINFO=OFF', 116*03ce13f7SAndroid Build Coastguard Worker '-DLLVM_ENABLE_LIBXML2=OFF', 117*03ce13f7SAndroid Build Coastguard Worker '-DLLVM_ENABLE_LIBEDIT=OFF', 118*03ce13f7SAndroid Build Coastguard Worker '-DLLVM_ENABLE_LIBPFM=OFF', 119*03ce13f7SAndroid Build Coastguard Worker '-DLLVM_ENABLE_ZLIB=OFF', 120*03ce13f7SAndroid Build Coastguard Worker '-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON' 121*03ce13f7SAndroid Build Coastguard Worker] 122*03ce13f7SAndroid Build Coastguard Worker 123*03ce13f7SAndroid Build Coastguard Worker# Used when building LLVM for darwin. Affects values set in the generated config files. 124*03ce13f7SAndroid Build Coastguard WorkerMIN_MACOS_VERSION = '10.10' 125*03ce13f7SAndroid Build Coastguard Worker 126*03ce13f7SAndroid Build Coastguard Worker@contextlib.contextmanager 127*03ce13f7SAndroid Build Coastguard Workerdef pushd(new_dir): 128*03ce13f7SAndroid Build Coastguard Worker previous_dir = os.getcwd() 129*03ce13f7SAndroid Build Coastguard Worker os.chdir(new_dir) 130*03ce13f7SAndroid Build Coastguard Worker try: 131*03ce13f7SAndroid Build Coastguard Worker yield 132*03ce13f7SAndroid Build Coastguard Worker finally: 133*03ce13f7SAndroid Build Coastguard Worker os.chdir(previous_dir) 134*03ce13f7SAndroid Build Coastguard Worker 135*03ce13f7SAndroid Build Coastguard Worker 136*03ce13f7SAndroid Build Coastguard Workerdef log(message, level=1): 137*03ce13f7SAndroid Build Coastguard Worker print(' ' * level + '> ' + message) 138*03ce13f7SAndroid Build Coastguard Worker 139*03ce13f7SAndroid Build Coastguard Worker 140*03ce13f7SAndroid Build Coastguard Workerdef run_command(command, log_level=1): 141*03ce13f7SAndroid Build Coastguard Worker log(command, log_level) 142*03ce13f7SAndroid Build Coastguard Worker os.system(command) 143*03ce13f7SAndroid Build Coastguard Worker 144*03ce13f7SAndroid Build Coastguard Worker 145*03ce13f7SAndroid Build Coastguard Workerdef run_subprocess(*popenargs, log_level=1, cwd=None): 146*03ce13f7SAndroid Build Coastguard Worker log([' '.join(t) for t in popenargs][0], log_level) 147*03ce13f7SAndroid Build Coastguard Worker return subprocess.run(*popenargs, cwd=cwd) 148*03ce13f7SAndroid Build Coastguard Worker 149*03ce13f7SAndroid Build Coastguard Worker 150*03ce13f7SAndroid Build Coastguard Workerdef _parse_args(): 151*03ce13f7SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 152*03ce13f7SAndroid Build Coastguard Worker parser.add_argument('name', help='destination name', 153*03ce13f7SAndroid Build Coastguard Worker choices=['android', 'linux', 'darwin', 'windows', 'fuchsia']) 154*03ce13f7SAndroid Build Coastguard Worker parser.add_argument('-j', '--jobs', help='parallel compilation', type=int) 155*03ce13f7SAndroid Build Coastguard Worker return parser.parse_args() 156*03ce13f7SAndroid Build Coastguard Worker 157*03ce13f7SAndroid Build Coastguard Worker 158*03ce13f7SAndroid Build Coastguard Workerdef validate_args(args): 159*03ce13f7SAndroid Build Coastguard Worker host = platform.system() 160*03ce13f7SAndroid Build Coastguard Worker if host not in LLVM_PLATFORM_TO_HOST_SYSTEM.values(): 161*03ce13f7SAndroid Build Coastguard Worker raise Exception(f"Host system not supported: '{host}'") 162*03ce13f7SAndroid Build Coastguard Worker 163*03ce13f7SAndroid Build Coastguard Worker if args.name not in LLVM_PLATFORM_TO_HOST_SYSTEM.keys(): 164*03ce13f7SAndroid Build Coastguard Worker raise Exception(f"Unknown target platform: '{args.name}'") 165*03ce13f7SAndroid Build Coastguard Worker 166*03ce13f7SAndroid Build Coastguard Worker expected_host = LLVM_PLATFORM_TO_HOST_SYSTEM[args.name] 167*03ce13f7SAndroid Build Coastguard Worker if LLVM_PLATFORM_TO_HOST_SYSTEM[args.name] != host: 168*03ce13f7SAndroid Build Coastguard Worker raise Exception( 169*03ce13f7SAndroid Build Coastguard Worker f"Target platform '{args.name}' must be built on '{expected_host}', not on '{host}'") 170*03ce13f7SAndroid Build Coastguard Worker 171*03ce13f7SAndroid Build Coastguard Worker 172*03ce13f7SAndroid Build Coastguard Workerdef get_cmake_targets_to_build(platform): 173*03ce13f7SAndroid Build Coastguard Worker """Returns list of LLVM targets to build for the input platform""" 174*03ce13f7SAndroid Build Coastguard Worker targets = set() 175*03ce13f7SAndroid Build Coastguard Worker for arch_def, triplet in LLVM_TRIPLES[platform]: 176*03ce13f7SAndroid Build Coastguard Worker for arch, defs in LLVM_TARGETS: 177*03ce13f7SAndroid Build Coastguard Worker if arch_def in defs: 178*03ce13f7SAndroid Build Coastguard Worker targets.add(arch) 179*03ce13f7SAndroid Build Coastguard Worker 180*03ce13f7SAndroid Build Coastguard Worker # Maintain the sort order of LLVM_TARGETS as this affects how config 181*03ce13f7SAndroid Build Coastguard Worker # headers are generated 182*03ce13f7SAndroid Build Coastguard Worker return [t[0] for t in LLVM_TARGETS if t[0] in targets] 183*03ce13f7SAndroid Build Coastguard Worker 184*03ce13f7SAndroid Build Coastguard Worker 185*03ce13f7SAndroid Build Coastguard Workerdef clone_llvm(): 186*03ce13f7SAndroid Build Coastguard Worker log("Cloning/Updating LLVM", 1) 187*03ce13f7SAndroid Build Coastguard Worker # Clone or update staging directory 188*03ce13f7SAndroid Build Coastguard Worker if not path.exists(LLVM_STAGING_DIR): 189*03ce13f7SAndroid Build Coastguard Worker os.mkdir(LLVM_STAGING_DIR) 190*03ce13f7SAndroid Build Coastguard Worker with pushd(LLVM_STAGING_DIR): 191*03ce13f7SAndroid Build Coastguard Worker run_command('git init', 2) 192*03ce13f7SAndroid Build Coastguard Worker run_command( 193*03ce13f7SAndroid Build Coastguard Worker 'git remote add origin https://github.com/llvm/llvm-project.git', 2) 194*03ce13f7SAndroid Build Coastguard Worker run_command('git config core.sparsecheckout true', 2) 195*03ce13f7SAndroid Build Coastguard Worker run_command('echo /llvm > .git/info/sparse-checkout', 2) 196*03ce13f7SAndroid Build Coastguard Worker 197*03ce13f7SAndroid Build Coastguard Worker with pushd(LLVM_STAGING_DIR): 198*03ce13f7SAndroid Build Coastguard Worker run_command('echo /llvm > .git/info/sparse-checkout', 2) 199*03ce13f7SAndroid Build Coastguard Worker run_command('git fetch origin {}'.format(LLVM_BRANCH), 2) 200*03ce13f7SAndroid Build Coastguard Worker run_command('git checkout {}'.format(LLVM_COMMIT), 2) 201*03ce13f7SAndroid Build Coastguard Worker return 202*03ce13f7SAndroid Build Coastguard Worker 203*03ce13f7SAndroid Build Coastguard Worker 204*03ce13f7SAndroid Build Coastguard Workerdef build_llvm(name, num_jobs): 205*03ce13f7SAndroid Build Coastguard Worker """Build LLVM and get all generated files.""" 206*03ce13f7SAndroid Build Coastguard Worker log("Building LLVM", 1) 207*03ce13f7SAndroid Build Coastguard Worker if num_jobs is None: 208*03ce13f7SAndroid Build Coastguard Worker num_jobs = multiprocessing.cpu_count() 209*03ce13f7SAndroid Build Coastguard Worker 210*03ce13f7SAndroid Build Coastguard Worker """On Windows we need to have CMake generate build files for the 64-bit 211*03ce13f7SAndroid Build Coastguard Worker Visual Studio host toolchain.""" 212*03ce13f7SAndroid Build Coastguard Worker host = '-Thost=x64' if name == 'windows' else '' 213*03ce13f7SAndroid Build Coastguard Worker 214*03ce13f7SAndroid Build Coastguard Worker cmake_options = LLVM_CMAKE_OPTIONS + ['-DLLVM_TARGETS_TO_BUILD=' + 215*03ce13f7SAndroid Build Coastguard Worker ';'.join(t for t in get_cmake_targets_to_build(name))] 216*03ce13f7SAndroid Build Coastguard Worker 217*03ce13f7SAndroid Build Coastguard Worker if name == 'darwin': 218*03ce13f7SAndroid Build Coastguard Worker cmake_options.append('-DCMAKE_OSX_DEPLOYMENT_TARGET={}'.format(MIN_MACOS_VERSION)) 219*03ce13f7SAndroid Build Coastguard Worker 220*03ce13f7SAndroid Build Coastguard Worker os.makedirs(LLVM_OBJS, exist_ok=True) 221*03ce13f7SAndroid Build Coastguard Worker run_subprocess(['cmake', host, LLVM_DIR] + 222*03ce13f7SAndroid Build Coastguard Worker cmake_options, log_level=2, cwd=LLVM_OBJS) 223*03ce13f7SAndroid Build Coastguard Worker run_subprocess(['cmake', '--build', '.', '-j', 224*03ce13f7SAndroid Build Coastguard Worker str(num_jobs)], log_level=2, cwd=LLVM_OBJS) 225*03ce13f7SAndroid Build Coastguard Worker 226*03ce13f7SAndroid Build Coastguard Worker 227*03ce13f7SAndroid Build Coastguard Workerdef list_files(src_base, src, dst_base, suffixes): 228*03ce13f7SAndroid Build Coastguard Worker """Enumerate the files that are under `src` and end with one of the 229*03ce13f7SAndroid Build Coastguard Worker `suffixes` and yield the source path and the destination path.""" 230*03ce13f7SAndroid Build Coastguard Worker src_base = path.abspath(src_base) 231*03ce13f7SAndroid Build Coastguard Worker src = path.join(src_base, src) 232*03ce13f7SAndroid Build Coastguard Worker for base_dir, dirnames, filenames in os.walk(src): 233*03ce13f7SAndroid Build Coastguard Worker for filename in filenames: 234*03ce13f7SAndroid Build Coastguard Worker if path.splitext(filename)[1] in suffixes: 235*03ce13f7SAndroid Build Coastguard Worker relative = path.relpath(base_dir, src_base) 236*03ce13f7SAndroid Build Coastguard Worker yield (path.join(base_dir, filename), 237*03ce13f7SAndroid Build Coastguard Worker path.join(dst_base, relative, filename)) 238*03ce13f7SAndroid Build Coastguard Worker 239*03ce13f7SAndroid Build Coastguard Worker 240*03ce13f7SAndroid Build Coastguard Workerdef copy_common_generated_files(dst_base): 241*03ce13f7SAndroid Build Coastguard Worker """Copy platform-independent generated files.""" 242*03ce13f7SAndroid Build Coastguard Worker log("Copying platform-independent generated files", 1) 243*03ce13f7SAndroid Build Coastguard Worker suffixes = {'.inc', '.h', '.def'} 244*03ce13f7SAndroid Build Coastguard Worker subdirs = [ 245*03ce13f7SAndroid Build Coastguard Worker path.join('include', 'llvm', 'IR'), 246*03ce13f7SAndroid Build Coastguard Worker path.join('include', 'llvm', 'Support'), 247*03ce13f7SAndroid Build Coastguard Worker path.join('lib', 'IR'), 248*03ce13f7SAndroid Build Coastguard Worker path.join('lib', 'Transforms', 'InstCombine'), 249*03ce13f7SAndroid Build Coastguard Worker ] + [path.join('lib', 'Target', arch) for arch, defs in LLVM_TARGETS] 250*03ce13f7SAndroid Build Coastguard Worker for subdir in subdirs: 251*03ce13f7SAndroid Build Coastguard Worker for src, dst in list_files(LLVM_OBJS, subdir, dst_base, suffixes): 252*03ce13f7SAndroid Build Coastguard Worker log('{} -> {}'.format(src, dst), 2) 253*03ce13f7SAndroid Build Coastguard Worker os.makedirs(path.dirname(dst), exist_ok=True) 254*03ce13f7SAndroid Build Coastguard Worker shutil.copyfile(src, dst) 255*03ce13f7SAndroid Build Coastguard Worker 256*03ce13f7SAndroid Build Coastguard Worker 257*03ce13f7SAndroid Build Coastguard Workerdef copy_platform_file(platform, src, dst): 258*03ce13f7SAndroid Build Coastguard Worker """Copy platform-dependent generated files and add platform-specific 259*03ce13f7SAndroid Build Coastguard Worker modifications.""" 260*03ce13f7SAndroid Build Coastguard Worker 261*03ce13f7SAndroid Build Coastguard Worker # LLVM configuration patterns to be post-processed. 262*03ce13f7SAndroid Build Coastguard Worker llvm_target_pattern = re.compile('^LLVM_[A-Z_]+\\(([A-Za-z0-9_]+)\\)$') 263*03ce13f7SAndroid Build Coastguard Worker llvm_native_pattern = re.compile( 264*03ce13f7SAndroid Build Coastguard Worker '^#define LLVM_NATIVE_([A-Z]+) (LLVMInitialize)?(.*)$') 265*03ce13f7SAndroid Build Coastguard Worker llvm_triple_pattern = re.compile('^#define (LLVM_[A-Z_]+_TRIPLE) "(.*)"$') 266*03ce13f7SAndroid Build Coastguard Worker llvm_define_pattern = re.compile('^#define ([A-Za-z0-9_]+) (.*)$') 267*03ce13f7SAndroid Build Coastguard Worker 268*03ce13f7SAndroid Build Coastguard Worker # Build architecture-specific conditions. 269*03ce13f7SAndroid Build Coastguard Worker conds = {} 270*03ce13f7SAndroid Build Coastguard Worker for arch, defs in LLVM_TARGETS: 271*03ce13f7SAndroid Build Coastguard Worker conds[arch] = ' || '.join('defined(' + v + ')' for v in defs) 272*03ce13f7SAndroid Build Coastguard Worker 273*03ce13f7SAndroid Build Coastguard Worker # Get a set of platform-specific triples. 274*03ce13f7SAndroid Build Coastguard Worker triples = LLVM_TRIPLES[platform] 275*03ce13f7SAndroid Build Coastguard Worker 276*03ce13f7SAndroid Build Coastguard Worker with open(src, 'r') as src_file: 277*03ce13f7SAndroid Build Coastguard Worker os.makedirs(path.dirname(dst), exist_ok=True) 278*03ce13f7SAndroid Build Coastguard Worker with open(dst, 'w') as dst_file: 279*03ce13f7SAndroid Build Coastguard Worker for line in src_file: 280*03ce13f7SAndroid Build Coastguard Worker if line == '#define LLVM_CONFIG_H\n': 281*03ce13f7SAndroid Build Coastguard Worker print(line, file=dst_file, end='') 282*03ce13f7SAndroid Build Coastguard Worker print('', file=dst_file) 283*03ce13f7SAndroid Build Coastguard Worker print('#if !defined(__i386__) && defined(_M_IX86)', 284*03ce13f7SAndroid Build Coastguard Worker file=dst_file) 285*03ce13f7SAndroid Build Coastguard Worker print('#define __i386__ 1', file=dst_file) 286*03ce13f7SAndroid Build Coastguard Worker print('#endif', file=dst_file) 287*03ce13f7SAndroid Build Coastguard Worker print('', file=dst_file) 288*03ce13f7SAndroid Build Coastguard Worker print( 289*03ce13f7SAndroid Build Coastguard Worker '#if !defined(__x86_64__) && (defined(_M_AMD64) || defined (_M_X64))', file=dst_file) 290*03ce13f7SAndroid Build Coastguard Worker print('#define __x86_64__ 1', file=dst_file) 291*03ce13f7SAndroid Build Coastguard Worker print('#endif', file=dst_file) 292*03ce13f7SAndroid Build Coastguard Worker print('', file=dst_file) 293*03ce13f7SAndroid Build Coastguard Worker 294*03ce13f7SAndroid Build Coastguard Worker match = llvm_target_pattern.match(line) 295*03ce13f7SAndroid Build Coastguard Worker if match: 296*03ce13f7SAndroid Build Coastguard Worker arch = match.group(1) 297*03ce13f7SAndroid Build Coastguard Worker print('#if ' + conds[arch], file=dst_file) 298*03ce13f7SAndroid Build Coastguard Worker print(line, file=dst_file, end='') 299*03ce13f7SAndroid Build Coastguard Worker print('#endif', file=dst_file) 300*03ce13f7SAndroid Build Coastguard Worker continue 301*03ce13f7SAndroid Build Coastguard Worker 302*03ce13f7SAndroid Build Coastguard Worker match = llvm_native_pattern.match(line) 303*03ce13f7SAndroid Build Coastguard Worker if match: 304*03ce13f7SAndroid Build Coastguard Worker name = match.group(1) 305*03ce13f7SAndroid Build Coastguard Worker init = match.group(2) or '' 306*03ce13f7SAndroid Build Coastguard Worker arch = match.group(3) 307*03ce13f7SAndroid Build Coastguard Worker end = '' 308*03ce13f7SAndroid Build Coastguard Worker if arch.lower().endswith(name.lower()): 309*03ce13f7SAndroid Build Coastguard Worker end = arch[-len(name):] 310*03ce13f7SAndroid Build Coastguard Worker directive = '#if ' 311*03ce13f7SAndroid Build Coastguard Worker for arch, defs in LLVM_TARGETS: 312*03ce13f7SAndroid Build Coastguard Worker print(directive + conds[arch], file=dst_file) 313*03ce13f7SAndroid Build Coastguard Worker print('#define LLVM_NATIVE_' + name + ' ' + 314*03ce13f7SAndroid Build Coastguard Worker init + arch + end, file=dst_file) 315*03ce13f7SAndroid Build Coastguard Worker directive = '#elif ' 316*03ce13f7SAndroid Build Coastguard Worker print('#else', file=dst_file) 317*03ce13f7SAndroid Build Coastguard Worker print('#error "unknown architecture"', file=dst_file) 318*03ce13f7SAndroid Build Coastguard Worker print('#endif', file=dst_file) 319*03ce13f7SAndroid Build Coastguard Worker continue 320*03ce13f7SAndroid Build Coastguard Worker 321*03ce13f7SAndroid Build Coastguard Worker match = llvm_triple_pattern.match(line) 322*03ce13f7SAndroid Build Coastguard Worker if match: 323*03ce13f7SAndroid Build Coastguard Worker name = match.group(1) 324*03ce13f7SAndroid Build Coastguard Worker directive = '#if' 325*03ce13f7SAndroid Build Coastguard Worker for defs, triple in triples: 326*03ce13f7SAndroid Build Coastguard Worker print(directive + ' defined(' + defs + ')', 327*03ce13f7SAndroid Build Coastguard Worker file=dst_file) 328*03ce13f7SAndroid Build Coastguard Worker print('#define ' + name + ' "' + triple + '"', 329*03ce13f7SAndroid Build Coastguard Worker file=dst_file) 330*03ce13f7SAndroid Build Coastguard Worker directive = '#elif' 331*03ce13f7SAndroid Build Coastguard Worker print('#else', file=dst_file) 332*03ce13f7SAndroid Build Coastguard Worker print('#error "unknown architecture"', file=dst_file) 333*03ce13f7SAndroid Build Coastguard Worker print('#endif', file=dst_file) 334*03ce13f7SAndroid Build Coastguard Worker continue 335*03ce13f7SAndroid Build Coastguard Worker 336*03ce13f7SAndroid Build Coastguard Worker match = llvm_define_pattern.match(line) 337*03ce13f7SAndroid Build Coastguard Worker if match and match.group(1) in LLVM_UNDEF_MACROS: 338*03ce13f7SAndroid Build Coastguard Worker print('/* #undef ' + match.group(1) + ' */', file=dst_file) 339*03ce13f7SAndroid Build Coastguard Worker continue 340*03ce13f7SAndroid Build Coastguard Worker 341*03ce13f7SAndroid Build Coastguard Worker print(line, file=dst_file, end='') 342*03ce13f7SAndroid Build Coastguard Worker 343*03ce13f7SAndroid Build Coastguard Worker 344*03ce13f7SAndroid Build Coastguard Workerdef copy_platform_generated_files(platform, dst_base): 345*03ce13f7SAndroid Build Coastguard Worker """Copy platform-specific generated files.""" 346*03ce13f7SAndroid Build Coastguard Worker log("Copying platform-specific generated files", 1) 347*03ce13f7SAndroid Build Coastguard Worker suffixes = {'.inc', '.h', '.def'} 348*03ce13f7SAndroid Build Coastguard Worker src_dir = path.join('include', 'llvm', 'Config') 349*03ce13f7SAndroid Build Coastguard Worker for src, dst in list_files(LLVM_OBJS, src_dir, dst_base, suffixes): 350*03ce13f7SAndroid Build Coastguard Worker log('{}, {} -> {}'.format(platform, src, dst), 2) 351*03ce13f7SAndroid Build Coastguard Worker copy_platform_file(platform, src, dst) 352*03ce13f7SAndroid Build Coastguard Worker 353*03ce13f7SAndroid Build Coastguard Worker 354*03ce13f7SAndroid Build Coastguard Workerdef main(): 355*03ce13f7SAndroid Build Coastguard Worker args = _parse_args() 356*03ce13f7SAndroid Build Coastguard Worker validate_args(args) 357*03ce13f7SAndroid Build Coastguard Worker clone_llvm() 358*03ce13f7SAndroid Build Coastguard Worker build_llvm(args.name, args.jobs) 359*03ce13f7SAndroid Build Coastguard Worker copy_common_generated_files(path.join(LLVM_CONFIGS, 'common')) 360*03ce13f7SAndroid Build Coastguard Worker copy_platform_generated_files( 361*03ce13f7SAndroid Build Coastguard Worker args.name, path.join(LLVM_CONFIGS, args.name)) 362*03ce13f7SAndroid Build Coastguard Worker 363*03ce13f7SAndroid Build Coastguard Worker 364*03ce13f7SAndroid Build Coastguard Workerif __name__ == '__main__': 365*03ce13f7SAndroid Build Coastguard Worker main() 366