зеркало из https://github.com/microsoft/clang-1.git
PR 11326: Lack diagnosic message when ABI conflicts on ARM
When both Triple and -mabi are used, it may result into conflicting ABI value. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176531 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
eb8f69f094
Коммит
46a2290c03
|
@ -107,6 +107,8 @@ def err_target_unknown_cpu : Error<"unknown target CPU '%0'">;
|
|||
def err_target_unknown_abi : Error<"unknown target ABI '%0'">;
|
||||
def err_target_unknown_cxxabi : Error<"unknown C++ ABI '%0'">;
|
||||
def err_target_invalid_feature : Error<"invalid target feature '%0'">;
|
||||
def warn_target_override_abi: Warning<"unused environment '%0'">,
|
||||
InGroup<Unused>;
|
||||
|
||||
// Source manager
|
||||
def err_cannot_open_file : Error<"cannot open file '%0': %1">, DefaultFatal;
|
||||
|
|
|
@ -1471,7 +1471,8 @@ static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,
|
|||
Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes);
|
||||
}
|
||||
|
||||
static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
|
||||
static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
|
||||
DiagnosticsEngine &Diags) {
|
||||
using namespace options;
|
||||
Opts.ABI = Args.getLastArgValue(OPT_target_abi);
|
||||
Opts.CXXABI = Args.getLastArgValue(OPT_cxx_abi);
|
||||
|
@ -1483,6 +1484,21 @@ static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args) {
|
|||
// Use the default target triple if unspecified.
|
||||
if (Opts.Triple.empty())
|
||||
Opts.Triple = llvm::sys::getDefaultTargetTriple();
|
||||
|
||||
// Check if Opts.ABI conflicts with the environment of triple on ARM.
|
||||
llvm::Triple T(Opts.Triple);
|
||||
if (T.getArch() == llvm::Triple::arm && !Opts.ABI.empty() &&
|
||||
!T.getEnvironmentName().empty()) {
|
||||
llvm::Triple::EnvironmentType env = T.getEnvironment();
|
||||
// Env and ABI (Triple::EnvironmentType and ARMABIInfo::ABIKind) are not
|
||||
// 1-to-1 mapping. Later on, Env will be overrided by ABI option when
|
||||
// computing ARMABIInfo.
|
||||
bool isOpsEABI = StringRef(Opts.ABI).startswith("aapcs");
|
||||
bool isEnvEABI = (env == llvm::Triple::GNUEABI || env == llvm::Triple::EABI
|
||||
|| env == llvm::Triple::Android);
|
||||
if (isEnvEABI != isOpsEABI)
|
||||
Diags.Report(diag::warn_target_override_abi) << T.getEnvironmentName();
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -1547,7 +1563,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
|
|||
ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, FileMgr, Diags);
|
||||
ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args,
|
||||
Res.getFrontendOpts().ProgramAction);
|
||||
ParseTargetArgs(Res.getTargetOpts(), *Args);
|
||||
ParseTargetArgs(Res.getTargetOpts(), *Args, Diags);
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// Test -targat and -mabi.
|
||||
|
||||
// RUN: %clang -target arm-none-none-gnu -mabi=aapcs %s -c -S -o %t.s 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-WARN1 %s
|
||||
//CHECK-WARN1: warning: unused environment 'gnu'
|
||||
|
||||
// RUN: %clang -target arm-none-none-gnueabi -mabi=apcs-gnu %s -c -S -o %t.s 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix=CHECK-WARN2 %s
|
||||
// CHECK-WARN2: warning: unused environment 'gnueabi'
|
||||
|
||||
// RUN: %clang -target arm-none-none-gnueabi -mabi=aapcs-gnu %s -c -S -o %t.s 2>&1 \
|
||||
// RUN: | FileCheck %s
|
||||
// CHECK-NOT: warning: unused environment
|
||||
|
||||
// RUN: %clang -target arm-none-none-gnu -mabi=apcs-gnu %s -c -S -o %t.s 2>&1 \
|
||||
// RUN: | FileCheck %s
|
||||
// CHECK-NOT: warning: unused environment
|
Загрузка…
Ссылка в новой задаче