| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| from __future__ import print_function |
| import os |
| import sys |
| |
| wopt = " -w" |
| test_params = { |
| "bindump": "nm", |
| "runtool": "", # if None, then runtool_func must exists |
| "Platform": "linux-gcc", |
| "cxx_rtti": "-frtti", # option to enable rtti |
| "cxx_exceptions": "-fexceptions", # option to enable rtti |
| "cxx_cpp11": "-std=c++0x", |
| } |
| |
| |
| def build_cxx_compiler_name(cn): |
| # build c++ compiler name from C compiler name |
| # <prefix>clang <options> : becomes <prefix>clang -x c++ <options> |
| # <prefix>gcc <options> : becomes <prefix>g++ <options> |
| # <prefix>gcc-<vers> <options>: becomes <prefix>g++-<vers> <options> |
| |
| cnlen = len(cn) |
| if cn == "clang": # plain clang |
| return "clang -x c++" |
| |
| idx = cn.find("clang ") |
| if idx >= 0: # clang with some options |
| return cn[: (idx + 6)] + "-x c++ " + cn[(idx + 6) :] |
| |
| idx = cn.rfind("clang") |
| if idx == (cnlen - 5): # ends in gcc |
| return cn + " -x c++" |
| |
| if cn == "gcc": |
| return "g++" |
| |
| idx = cn.rfind("gcc") |
| if idx == (cnlen - 3): # ends in gcc |
| return cn + " -x c++" |
| |
| idx = cn.find("gcc ") |
| if idx >= 0: # gcc with some options |
| return cn[: (idx + 1)] + "++ " + cn[(idx + 4) :] |
| |
| idx = cn.find("gcc-") |
| if idx >= 0: # gcc-<version> |
| return cn[: (idx + 1)] + "++" + cn[(idx + 3) :] |
| |
| return "UNEXPECTED COMPILER" |
| |
| |
| def build_linker_name(cn): |
| # build linkercompiler name from C compiler name |
| # <prefix>clang <options> : becomes <prefix>clang++ <options> |
| # <prefix>gcc <options> : becomes <prefix>g++ <options> |
| # <prefix>gcc-<vers> <options>: becomes <prefix>g++-<vers> <options> |
| |
| if cn == "clang": # plain clang |
| return "clang++" |
| |
| idx = cn.find("clang ") |
| if idx >= 0: # clang with some options |
| return cn[: (idx + 5)] + "++ " + cn[(idx + 6) :] |
| |
| cnlen = len(cn) |
| idx = cn.rfind("clang") |
| if idx == (cnlen - 5): # ends in clang |
| return cn + "++" |
| |
| return build_cxx_compiler_name( |
| cn |
| ) # for gcc, linekr name is same as c++ compiler name |
| |
| |
| import subprocess |
| |
| if __name__ == "__main__": |
| print(sys.argv) |
| litargs = [sys.argv[0]] # args for lit.main |
| c_compiler_name = sys.argv[1].strip() |
| cxx_compiler_name = build_cxx_compiler_name(c_compiler_name) |
| linker_name = build_linker_name(c_compiler_name) |
| # print("C++ compiler:", cxx_compiler_name) |
| # print("linker :", linker_name) |
| for la in sys.argv[2:]: |
| litargs.append(la) |
| sys.argv = litargs |
| cmd = c_compiler_name.split() + ["-o", "b.exe", "test/common/genselector.c"] |
| # print("cmd = ", cmd) |
| rv = subprocess.call(cmd) |
| # print("rv = " , rv) |
| if rv != 0: |
| print("compiler failed: ", cmd) |
| sys.exit(1) |
| rv = subprocess.call("./b.exe") |
| fp = open("nselector.h") |
| fi = fp.read() |
| fp.close() |
| if "LP64" in fi: |
| test_params["Mode"] = "LP64-x86" |
| prf = "--check-prefix=LP64" |
| else: |
| # 'gcc -m32' or 'clang -m32' mode |
| test_params["Mode"] = "ILP32-x86" |
| prf = "--check-prefix=ILP32" |
| test_params["prefixes"] = prf |
| test_params["c_compiler"] = c_compiler_name |
| test_params["cxx_compiler"] = cxx_compiler_name |
| test_params["linker"] = linker_name |
| test_params["Platform"] = "linux-" + cmd[0] |
| |
| print("test_params = ", test_params) |
| builtin_parameters = { |
| "build_mode": "Release", |
| "llvm_site_config": os.path.join(os.getcwd(), "lit.site.cfg"), |
| "clang_site_config": os.path.join(os.getcwd(), "lit.site.cfg"), |
| "test_params": test_params, |
| } |
| # print("builtin_params = " , test_params) |
| from lit.main import main |
| |
| main(builtin_parameters) |