Commit a12f56ee by Antonio Maiorano

Add validation and platform restrictions to LLVM-10 update script

* Added validation to ensure that this script is run on the expected host OS. * Made it restrict the list of platforms LLVM is built for based on the selected target platform. * Made copy_common_generated_files use LLVM_TARGETS to determine which folders to copy. * Other minor cleanup/refactoring. Bug: b/152339534 Change-Id: I18c6e658688e487a83eb7b6bbbe4990029d47f8f Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/46269Tested-by: 's avatarAntonio Maiorano <amaiorano@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 6cd27bab
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
import argparse import argparse
import contextlib import contextlib
import multiprocessing import multiprocessing
import os import os
import platform
import re import re
import shutil import shutil
import subprocess import subprocess
...@@ -39,6 +39,7 @@ LLVM_DIR = path.abspath(path.join(LLVM_STAGING_DIR, "llvm")) ...@@ -39,6 +39,7 @@ LLVM_DIR = path.abspath(path.join(LLVM_STAGING_DIR, "llvm"))
LLVM_OBJS = path.join(LLVM_STAGING_DIR, "build") LLVM_OBJS = path.join(LLVM_STAGING_DIR, "build")
LLVM_CONFIGS = path.abspath(path.join(SCRIPT_DIR, '..', 'configs')) LLVM_CONFIGS = path.abspath(path.join(SCRIPT_DIR, '..', 'configs'))
# List of all arches SwiftShader supports
LLVM_TARGETS = [ LLVM_TARGETS = [
('AArch64', ('__aarch64__',)), ('AArch64', ('__aarch64__',)),
('ARM', ('__arm__',)), ('ARM', ('__arm__',)),
...@@ -47,6 +48,7 @@ LLVM_TARGETS = [ ...@@ -47,6 +48,7 @@ LLVM_TARGETS = [
('PowerPC', ('__powerpc64__',)), ('PowerPC', ('__powerpc64__',)),
] ]
# Per-platform arches
LLVM_TRIPLES = { LLVM_TRIPLES = {
'android': [ 'android': [
('__x86_64__', 'x86_64-linux-android'), ('__x86_64__', 'x86_64-linux-android'),
...@@ -76,9 +78,31 @@ LLVM_TRIPLES = { ...@@ -76,9 +78,31 @@ LLVM_TRIPLES = {
], ],
} }
LLVM_OPTIONS = [ # Mapping of target platform to the host it must be built on
LLVM_PLATFORM_TO_HOST_SYSTEM = {
'android': 'Linux',
'darwin': 'Darwin',
'linux': 'Linux',
'windows': 'Windows',
}
# LLVM configurations to be undefined.
LLVM_UNDEF_MACROS = [
'BACKTRACE_HEADER',
'ENABLE_BACKTRACES',
'ENABLE_CRASH_OVERRIDES',
'HAVE_BACKTRACE',
'HAVE_POSIX_SPAWN',
'HAVE_PTHREAD_GETNAME_NP',
'HAVE_PTHREAD_SETNAME_NP',
'HAVE_TERMIOS_H',
'HAVE_ZLIB_H',
'HAVE__UNWIND_BACKTRACE',
]
# General CMake options for building LLVM
LLVM_CMAKE_OPTIONS = [
'-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_BUILD_TYPE=Release',
'-DLLVM_TARGETS_TO_BUILD=' + ';'.join(t[0] for t in LLVM_TARGETS),
'-DLLVM_ENABLE_THREADS=ON', '-DLLVM_ENABLE_THREADS=ON',
'-DLLVM_ENABLE_TERMINFO=OFF', '-DLLVM_ENABLE_TERMINFO=OFF',
'-DLLVM_ENABLE_LIBXML2=OFF', '-DLLVM_ENABLE_LIBXML2=OFF',
...@@ -121,6 +145,33 @@ def _parse_args(): ...@@ -121,6 +145,33 @@ def _parse_args():
return parser.parse_args() return parser.parse_args()
def validate_args(args):
host = platform.system()
if host not in LLVM_PLATFORM_TO_HOST_SYSTEM.values():
raise Exception(f"Host system not supported: '{host}'")
if args.name not in LLVM_PLATFORM_TO_HOST_SYSTEM.keys():
raise Exception(f"Unknown target platform: '{args.name}'")
expected_host = LLVM_PLATFORM_TO_HOST_SYSTEM[args.name]
if LLVM_PLATFORM_TO_HOST_SYSTEM[args.name] != host:
raise Exception(
f"Target platform '{args.name}' must be built on '{expected_host}', not on '{host}'")
def get_cmake_targets_to_build(platform):
"""Returns list of LLVM targets to build for the input platform"""
targets = set()
for arch_def, triplet in LLVM_TRIPLES[platform]:
for arch, defs in LLVM_TARGETS:
if arch_def in defs:
targets.add(arch)
# Maintain the sort order of LLVM_TARGETS as this affects how config
# headers are generated
return [t[0] for t in LLVM_TARGETS if t[0] in targets]
def clone_llvm(): def clone_llvm():
log("Cloning/Updating LLVM", 1) log("Cloning/Updating LLVM", 1)
# Clone or update staging directory # Clone or update staging directory
...@@ -150,9 +201,12 @@ def build_llvm(name, num_jobs): ...@@ -150,9 +201,12 @@ def build_llvm(name, num_jobs):
Visual Studio host toolchain.""" Visual Studio host toolchain."""
host = '-Thost=x64' if name == 'windows' else '' host = '-Thost=x64' if name == 'windows' else ''
cmake_options = LLVM_CMAKE_OPTIONS + ['-DLLVM_TARGETS_TO_BUILD=' +
';'.join(t for t in get_cmake_targets_to_build(name))]
os.makedirs(LLVM_OBJS, exist_ok=True) os.makedirs(LLVM_OBJS, exist_ok=True)
run_subprocess(['cmake', host, LLVM_DIR] + run_subprocess(['cmake', host, LLVM_DIR] +
LLVM_OPTIONS, log_level=2, cwd=LLVM_OBJS) cmake_options, log_level=2, cwd=LLVM_OBJS)
run_subprocess(['cmake', '--build', '.', '-j', run_subprocess(['cmake', '--build', '.', '-j',
str(num_jobs)], log_level=2, cwd=LLVM_OBJS) str(num_jobs)], log_level=2, cwd=LLVM_OBJS)
...@@ -178,13 +232,8 @@ def copy_common_generated_files(dst_base): ...@@ -178,13 +232,8 @@ def copy_common_generated_files(dst_base):
path.join('include', 'llvm', 'IR'), path.join('include', 'llvm', 'IR'),
path.join('include', 'llvm', 'Support'), path.join('include', 'llvm', 'Support'),
path.join('lib', 'IR'), path.join('lib', 'IR'),
path.join('lib', 'Target', 'AArch64'),
path.join('lib', 'Target', 'ARM'),
path.join('lib', 'Target', 'X86'),
path.join('lib', 'Target', 'Mips'),
path.join('lib', 'Target', 'PowerPC'),
path.join('lib', 'Transforms', 'InstCombine'), path.join('lib', 'Transforms', 'InstCombine'),
] ] + [path.join('lib', 'Target', arch) for arch, defs in LLVM_TARGETS]
for subdir in subdirs: for subdir in subdirs:
for src, dst in list_files(LLVM_OBJS, subdir, dst_base, suffixes): for src, dst in list_files(LLVM_OBJS, subdir, dst_base, suffixes):
log('{} -> {}'.format(src, dst), 2) log('{} -> {}'.format(src, dst), 2)
...@@ -203,20 +252,6 @@ def copy_platform_file(platform, src, dst): ...@@ -203,20 +252,6 @@ def copy_platform_file(platform, src, dst):
llvm_triple_pattern = re.compile('^#define (LLVM_[A-Z_]+_TRIPLE) "(.*)"$') llvm_triple_pattern = re.compile('^#define (LLVM_[A-Z_]+_TRIPLE) "(.*)"$')
llvm_define_pattern = re.compile('^#define ([A-Za-z0-9_]+) (.*)$') llvm_define_pattern = re.compile('^#define ([A-Za-z0-9_]+) (.*)$')
# LLVM configurations to be undefined.
undef_names = [
'BACKTRACE_HEADER',
'ENABLE_BACKTRACES',
'ENABLE_CRASH_OVERRIDES',
'HAVE_BACKTRACE',
'HAVE_POSIX_SPAWN',
'HAVE_PTHREAD_GETNAME_NP',
'HAVE_PTHREAD_SETNAME_NP',
'HAVE_TERMIOS_H',
'HAVE_ZLIB_H',
'HAVE__UNWIND_BACKTRACE',
]
# Build architecture-specific conditions. # Build architecture-specific conditions.
conds = {} conds = {}
for arch, defs in LLVM_TARGETS: for arch, defs in LLVM_TARGETS:
...@@ -286,7 +321,7 @@ def copy_platform_file(platform, src, dst): ...@@ -286,7 +321,7 @@ def copy_platform_file(platform, src, dst):
continue continue
match = llvm_define_pattern.match(line) match = llvm_define_pattern.match(line)
if match and match.group(1) in undef_names: if match and match.group(1) in LLVM_UNDEF_MACROS:
print('/* #undef ' + match.group(1) + ' */', file=dst_file) print('/* #undef ' + match.group(1) + ' */', file=dst_file)
continue continue
...@@ -305,6 +340,7 @@ def copy_platform_generated_files(platform, dst_base): ...@@ -305,6 +340,7 @@ def copy_platform_generated_files(platform, dst_base):
def main(): def main():
args = _parse_args() args = _parse_args()
validate_args(args)
clone_llvm() clone_llvm()
build_llvm(args.name, args.jobs) build_llvm(args.name, args.jobs)
copy_common_generated_files(path.join(LLVM_CONFIGS, 'common')) copy_common_generated_files(path.join(LLVM_CONFIGS, 'common'))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment