xref: /aosp_15_r20/external/swiftshader/third_party/llvm-16.0/scripts/update.py (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
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