forked from OSchip/llvm-project
[clang][Arm] Fix handling of -Wa,-implicit-it=
Similiar to D95872, this flag can be set for the assembler directly. Move validation code into a reusable helper function. Link: https://bugs.llvm.org/show_bug.cgi?id=49023 Link: https://github.com/ClangBuiltLinux/linux/issues/1270 Reported-by: Arnd Bergmann <arnd@kernel.org> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Reviewed By: DavidSpickett Differential Revision: https://reviews.llvm.org/D96285
This commit is contained in:
parent
81c51891ad
commit
a680bc3a31
|
@ -2304,6 +2304,17 @@ void Clang::DumpCompilationDatabaseFragmentToDir(
|
||||||
DumpCompilationDatabase(C, "", Target, Output, Input, Args);
|
DumpCompilationDatabase(C, "", Target, Output, Input, Args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool AddARMImplicitITArgs(const ArgList &Args, ArgStringList &CmdArgs,
|
||||||
|
StringRef Value) {
|
||||||
|
if (Value == "always" || Value == "never" || Value == "arm" ||
|
||||||
|
Value == "thumb") {
|
||||||
|
CmdArgs.push_back("-mllvm");
|
||||||
|
CmdArgs.push_back(Args.MakeArgString("-arm-implicit-it=" + Value));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void CollectArgsForIntegratedAssembler(Compilation &C,
|
static void CollectArgsForIntegratedAssembler(Compilation &C,
|
||||||
const ArgList &Args,
|
const ArgList &Args,
|
||||||
ArgStringList &CmdArgs,
|
ArgStringList &CmdArgs,
|
||||||
|
@ -2327,15 +2338,10 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
|
||||||
case llvm::Triple::thumbeb:
|
case llvm::Triple::thumbeb:
|
||||||
if (Arg *A = Args.getLastArg(options::OPT_mimplicit_it_EQ)) {
|
if (Arg *A = Args.getLastArg(options::OPT_mimplicit_it_EQ)) {
|
||||||
StringRef Value = A->getValue();
|
StringRef Value = A->getValue();
|
||||||
if (Value == "always" || Value == "never" || Value == "arm" ||
|
if (!AddARMImplicitITArgs(Args, CmdArgs, Value))
|
||||||
Value == "thumb") {
|
|
||||||
CmdArgs.push_back("-mllvm");
|
|
||||||
CmdArgs.push_back(Args.MakeArgString("-arm-implicit-it=" + Value));
|
|
||||||
} else {
|
|
||||||
D.Diag(diag::err_drv_unsupported_option_argument)
|
D.Diag(diag::err_drv_unsupported_option_argument)
|
||||||
<< A->getOption().getName() << Value;
|
<< A->getOption().getName() << Value;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -2376,6 +2382,9 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
|
||||||
case llvm::Triple::thumbeb:
|
case llvm::Triple::thumbeb:
|
||||||
case llvm::Triple::arm:
|
case llvm::Triple::arm:
|
||||||
case llvm::Triple::armeb:
|
case llvm::Triple::armeb:
|
||||||
|
if (Value.startswith("-mimplicit-it=") &&
|
||||||
|
AddARMImplicitITArgs(Args, CmdArgs, Value.split("=").second))
|
||||||
|
continue;
|
||||||
if (Value == "-mthumb")
|
if (Value == "-mthumb")
|
||||||
// -mthumb has already been processed in ComputeLLVMTriple()
|
// -mthumb has already been processed in ComputeLLVMTriple()
|
||||||
// recognize but skip over here.
|
// recognize but skip over here.
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/// Simple tests for valid input.
|
||||||
|
/// -Wa,-implicit-it=
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always %s 2>&1 | FileCheck %s --check-prefix=ALWAYS
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=never %s 2>&1 | FileCheck %s --check-prefix=NEVER
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=arm %s 2>&1 | FileCheck %s --check-prefix=ARM
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=thumb %s 2>&1 | FileCheck %s --check-prefix=THUMB
|
||||||
|
/// -Xassembler -mimplicit-it=
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Xassembler -mimplicit-it=always %s 2>&1 | FileCheck %s --check-prefix=ALWAYS
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Xassembler -mimplicit-it=never %s 2>&1 | FileCheck %s --check-prefix=NEVER
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Xassembler -mimplicit-it=arm %s 2>&1 | FileCheck %s --check-prefix=ARM
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Xassembler -mimplicit-it=thumb %s 2>&1 | FileCheck %s --check-prefix=THUMB
|
||||||
|
/// Test space separated -Wa,- arguments (latter wins).
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=never -Wa,-mimplicit-it=always %s 2>&1 | FileCheck %s --check-prefix=ALWAYS
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always -Wa,-mimplicit-it=never %s 2>&1 | FileCheck %s --check-prefix=NEVER
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always -Wa,-mimplicit-it=arm %s 2>&1 | FileCheck %s --check-prefix=ARM
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always -Wa,-mimplicit-it=thumb %s 2>&1 | FileCheck %s --check-prefix=THUMB
|
||||||
|
/// Test comma separated -Wa,- arguments (latter wins).
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=never,-mimplicit-it=always %s 2>&1 | FileCheck %s --check-prefix=ALWAYS
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always,-mimplicit-it=never %s 2>&1 | FileCheck %s --check-prefix=NEVER
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always,-mimplicit-it=arm %s 2>&1 | FileCheck %s --check-prefix=ARM
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always,-mimplicit-it=thumb %s 2>&1 | FileCheck %s --check-prefix=THUMB
|
||||||
|
|
||||||
|
/// Mix -implicit-it= (compiler) with -Wa,-mimplicit-it= (assembler), assembler
|
||||||
|
/// takes priority. -mllvm -arm-implicit-it= will be repeated, with the
|
||||||
|
/// assembler flag appearing last (latter wins).
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -mimplicit-it=never -Wa,-mimplicit-it=always %S/Inputs/wildcard1.c 2>&1 | FileCheck %s --check-prefix=NEVER_ALWAYS
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -mimplicit-it=always -Wa,-mimplicit-it=never %S/Inputs/wildcard1.c 2>&1 | FileCheck %s --check-prefix=ALWAYS_NEVER
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=never -mimplicit-it=always %S/Inputs/wildcard1.c 2>&1 | FileCheck %s --check-prefix=ALWAYS_NEVER
|
||||||
|
|
||||||
|
/// Test invalid input.
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=foo %s 2>&1 | FileCheck %s --check-prefix=INVALID
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Xassembler -mimplicit-it=foo %s 2>&1 | FileCheck %s --check-prefix=XINVALID
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always -Wa,-mimplicit-it=foo %s 2>&1 | FileCheck %s --check-prefix=INVALID
|
||||||
|
// RUN: %clang -target arm-linux-gnueabi -### -Wa,-mimplicit-it=always,-mimplicit-it=foo %s 2>&1 | FileCheck %s --check-prefix=INVALID
|
||||||
|
|
||||||
|
|
||||||
|
// ALWAYS: "-mllvm" "-arm-implicit-it=always"
|
||||||
|
// NEVER: "-mllvm" "-arm-implicit-it=never"
|
||||||
|
// ARM: "-mllvm" "-arm-implicit-it=arm"
|
||||||
|
// THUMB: "-mllvm" "-arm-implicit-it=thumb"
|
||||||
|
// NEVER_ALWAYS: "-mllvm" "-arm-implicit-it=never" "-mllvm" "-arm-implicit-it=always"
|
||||||
|
// ALWAYS_NEVER: "-mllvm" "-arm-implicit-it=always" "-mllvm" "-arm-implicit-it=never"
|
||||||
|
// INVALID: error: unsupported argument '-mimplicit-it=foo' to option 'Wa,'
|
||||||
|
// XINVALID: error: unsupported argument '-mimplicit-it=foo' to option 'Xassembler'
|
Loading…
Reference in New Issue