xref: /aosp_15_r20/external/swiftshader/third_party/llvm-10.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-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