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