diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index f3bfc26f271cc..f6240f86447cb 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3452,9 +3452,9 @@ def l : JoinedOrSeparate<["-"], "l">, Flags<[LinkerInput, RenderJoined]>, Group; def lazy__framework : Separate<["-"], "lazy_framework">, Flags<[LinkerInput]>; def lazy__library : Separate<["-"], "lazy_library">, Flags<[LinkerInput]>; -def mlittle_endian : Flag<["-"], "mlittle-endian">, Flags<[NoXarchOption]>; +def mlittle_endian : Flag<["-"], "mlittle-endian">, Flags<[NoXarchOption,TargetSpecific]>; def EL : Flag<["-"], "EL">, Alias; -def mbig_endian : Flag<["-"], "mbig-endian">, Flags<[NoXarchOption]>; +def mbig_endian : Flag<["-"], "mbig-endian">, Flags<[NoXarchOption,TargetSpecific]>; def EB : Flag<["-"], "EB">, Alias; def m16 : Flag<["-"], "m16">, Group, Flags<[NoXarchOption, CoreOption]>; def m32 : Flag<["-"], "m32">, Group, Flags<[NoXarchOption, CoreOption]>; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ade59f45384fd..fee14ba6faabe 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -559,16 +559,14 @@ static llvm::Triple computeTargetTriple(const Driver &D, // Handle pseudo-target flags '-mlittle-endian'/'-EL' and // '-mbig-endian'/'-EB'. - if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian, - options::OPT_mbig_endian)) { - if (A->getOption().matches(options::OPT_mlittle_endian)) { - llvm::Triple LE = Target.getLittleEndianArchVariant(); - if (LE.getArch() != llvm::Triple::UnknownArch) - Target = std::move(LE); - } else { - llvm::Triple BE = Target.getBigEndianArchVariant(); - if (BE.getArch() != llvm::Triple::UnknownArch) - Target = std::move(BE); + if (Arg *A = Args.getLastArgNoClaim(options::OPT_mlittle_endian, + options::OPT_mbig_endian)) { + llvm::Triple T = A->getOption().matches(options::OPT_mlittle_endian) + ? Target.getLittleEndianArchVariant() + : Target.getBigEndianArchVariant(); + if (T.getArch() != llvm::Triple::UnknownArch) { + Target = std::move(T); + Args.claimAllArgs(options::OPT_mlittle_endian, options::OPT_mbig_endian); } } diff --git a/clang/test/Driver/endian.c b/clang/test/Driver/endian.c new file mode 100644 index 0000000000000..7fddbc93e9cd6 --- /dev/null +++ b/clang/test/Driver/endian.c @@ -0,0 +1,5 @@ +// RUN: %clang -### -c --target=x86_64 -mbig-endian -mlittle-endian %s 2>&1 | FileCheck /dev/null --implicit-check-not=error: +// RUN: %clang -### -c --target=x86_64 -mlittle-endian -mbig-endian %s 2>&1 | FileCheck %s --implicit-check-not=error: + +// CHECK: error: unsupported option '-mlittle-endian' for target 'x86_64' +// CHECK: error: unsupported option '-mbig-endian' for target 'x86_64' diff --git a/clang/test/Driver/ppc-endian.c b/clang/test/Driver/ppc-endian.c index 00c1c25bb358f..5854fa63fdc83 100644 --- a/clang/test/Driver/ppc-endian.c +++ b/clang/test/Driver/ppc-endian.c @@ -1,5 +1,5 @@ // RUN: %clang -target powerpc-unknown -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE32 %s -// RUN: %clang -target powerpc-unknown -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE32 %s +// RUN: %clang --target=powerpc-unknown -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE32 %s --implicit-check-not=error: // RUN: %clang -target powerpcle-unknown -mbig-endian -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE32 %s // CHECK-BE32: "-cc1"{{.*}} "-triple" "powerpc-{{.*}}" diff --git a/llvm/include/llvm/Option/ArgList.h b/llvm/include/llvm/Option/ArgList.h index 6a07e1c657dca..310c8900af9ef 100644 --- a/llvm/include/llvm/Option/ArgList.h +++ b/llvm/include/llvm/Option/ArgList.h @@ -354,6 +354,12 @@ class ArgList { /// option id. void ClaimAllArgs(OptSpecifier Id0) const; + template + void claimAllArgs(OptSpecifiers... Ids) const { + for (Arg *A : filtered(Ids...)) + A->claim(); + } + /// ClaimAllArgs - Claim all arguments. /// void ClaimAllArgs() const;