Index: lib/Driver/Tools.h =================================================================== --- lib/Driver/Tools.h +++ lib/Driver/Tools.h @@ -108,7 +108,8 @@ ClangAs(const ToolChain &TC) : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {} - + void AddMIPSTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; bool hasGoodDiagnostics() const override { return true; } bool hasIntegratedAssembler() const override { return false; } bool hasIntegratedCPP() const override { return false; } Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -1,4 +1,4 @@ -//===--- Tools.cpp - Tools Implementations --------------------------------===// +//===--- Tools.cpp - Tools Implementations --------------------------------===//ddMIPSTargetArgs/ // // The LLVM Compiler Infrastructure // @@ -4810,6 +4810,17 @@ return CLFallback.get(); } +void ClangAs::AddMIPSTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + StringRef CPUName; + StringRef ABIName; + const llvm::Triple &Triple = getToolChain().getTriple(); + mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName); + + CmdArgs.push_back("-target-abi"); + CmdArgs.push_back(ABIName.data()); +} + void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, @@ -4915,6 +4926,19 @@ // FIXME: Add -static support, once we have it. + // Add target specific flags. + switch(getToolChain().getArch()) { + default: + break; + + case llvm::Triple::mips: + case llvm::Triple::mipsel: + case llvm::Triple::mips64: + case llvm::Triple::mips64el: + AddMIPSTargetArgs(Args, CmdArgs); + break; + } + // Consume all the warning flags. Usually this would be handled more // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as // doesn't handle that so rather than warning about unused flags that are Index: test/Driver/mips-integrated-as.s =================================================================== --- test/Driver/mips-integrated-as.s +++ test/Driver/mips-integrated-as.s @@ -7,6 +7,7 @@ // ABI-O32: -cc1as // ABI-O32: "-target-feature" "-n64" // ABI-O32: "-target-feature" "+o32" +// ABI-O32: "-target-abi" "o32" // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s -mabi=eabi 2>&1 | \ // RUN: FileCheck -check-prefix=ABI-EABI32 %s @@ -14,6 +15,7 @@ // ABI-EABI32: "-target-feature" "-o32" // ABI-EABI32: "-target-feature" "-n64" // ABI-EABI32: "-target-feature" "+eabi" +// ABI-EABI32: "-target-abi" "eabi" // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s -mips64 -mabi=n32 2>&1 | \ // RUN: FileCheck -check-prefix=ABI-N32 %s @@ -23,6 +25,7 @@ // ABI-N32: "-target-feature" "-o32" // ABI-N32: "-target-feature" "-n64" // ABI-N32: "-target-feature" "+n32" +// ABI-N32: "-target-abi" "n32" // FIXME: We should also test '-target mips-linux-gnu -mips64' defaults to the // default 64-bit ABI (N64 but GCC uses N32). It currently selects O32 @@ -41,6 +44,7 @@ // ABI-N64: -cc1as // ABI-N64: "-target-feature" "-o32" // ABI-N64: "-target-feature" "+n64" +// ABI-N64: "-target-abi" "n64" // RUN: %clang -target mips-linux-gnu -### -fintegrated-as -c %s -msoft-float 2>&1 | \ // RUN: FileCheck -check-prefix=SOFTFLOAT %s