dsanders updated this revision to Diff 63676.
dsanders added a comment.
Updated to match latest version of http://reviews.llvm.org/D21467.
At this point Mips is in the X86/everyone-else camp but there's a loose end to
tie up in LLVM in order to prove it. Once LLVM rejects non-empty ABIName's
for Mips, we have proven we're in the X86/everyone-else camp and can start
uniting the Mips/X86/everyone-else camp with the ARM/PowerPC camp.
http://reviews.llvm.org/D21070
Files:
lib/Basic/Targets.cpp
lib/Driver/ToolChains.cpp
lib/Driver/Tools.cpp
lib/Frontend/CompilerInvocation.cpp
tools/driver/cc1as_main.cpp
Index: tools/driver/cc1as_main.cpp
===================================================================
--- tools/driver/cc1as_main.cpp
+++ tools/driver/cc1as_main.cpp
@@ -69,6 +69,10 @@
/// The name of the target triple to assemble for.
std::string Triple;
+ /// The name of the ABI to assembler for or the empty string for the default
+ /// ABI.
+ std::string ABI;
+
/// If given, the name of the target CPU to determine which instructions
/// are legal.
std::string CPU;
@@ -134,6 +138,7 @@
public:
AssemblerInvocation() {
Triple = "";
+ ABI = "";
NoInitialTextSection = 0;
InputFile = "-";
OutputPath = "-";
@@ -185,13 +190,24 @@
// Target Options
Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
+ Opts.ABI = Args.getLastArgValue(OPT_target_abi);
Opts.CPU = Args.getLastArgValue(OPT_target_cpu);
Opts.Features = Args.getAllArgValues(OPT_target_feature);
// Use the default target triple if unspecified.
if (Opts.Triple.empty())
Opts.Triple = llvm::sys::getDefaultTargetTriple();
+ // Modify the Triple and ABI according to the Triple and ABI.
+ llvm::Triple ABITriple;
+ StringRef ABIName;
+ std::tie(ABITriple, ABIName) =
+ llvm::Triple(Opts.Triple).getABIVariant(Opts.ABI);
+ if (ABITriple.getArch() == llvm::Triple::UnknownArch)
+ Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
+ Opts.Triple = ABITriple.str();
+ Opts.ABI = ABIName;
+
// Language Options
Opts.IncludePaths = Args.getAllArgValues(OPT_I);
Opts.NoInitialTextSection = Args.hasArg(OPT_n);
Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -2301,6 +2301,16 @@
// Use the default target triple if unspecified.
if (Opts.Triple.empty())
Opts.Triple = llvm::sys::getDefaultTargetTriple();
+
+ // Modify the Triple and ABI according to the Triple and ABI.
+ llvm::Triple ABITriple;
+ StringRef ABIName;
+ std::tie(ABITriple, ABIName) =
+ llvm::Triple(Opts.Triple).getABIVariant(Opts.ABI);
+ if (ABITriple.getArch() == llvm::Triple::UnknownArch)
+ Diags.Report(diag::err_target_unknown_abi) << Opts.ABI;
+ Opts.Triple = ABITriple.str();
+ Opts.ABI = ABIName;
}
bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -1202,7 +1202,7 @@
// MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
// default for mips64(el)?-img-linux-gnu.
if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
- Triple.getEnvironment() == llvm::Triple::GNU) {
+ Triple.isGNUEnvironment()) {
DefMips32CPU = "mips32r6";
DefMips64CPU = "mips64r6";
}
Index: lib/Driver/ToolChains.cpp
===================================================================
--- lib/Driver/ToolChains.cpp
+++ lib/Driver/ToolChains.cpp
@@ -2344,7 +2344,7 @@
if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
TargetTriple.getOS() == llvm::Triple::Linux &&
- TargetTriple.getEnvironment() == llvm::Triple::GNU)
+ TargetTriple.isGNUEnvironment())
return findMipsImgMultilibs(Flags, NonExistent, Result);
if (findMipsCsMultilibs(Flags, NonExistent, Result))
Index: lib/Basic/Targets.cpp
===================================================================
--- lib/Basic/Targets.cpp
+++ lib/Basic/Targets.cpp
@@ -7134,10 +7134,22 @@
BigEndian = getTriple().getArch() == llvm::Triple::mips ||
getTriple().getArch() == llvm::Triple::mips64;
- setABI((getTriple().getArch() == llvm::Triple::mips ||
- getTriple().getArch() == llvm::Triple::mipsel)
- ? "o32"
- : "n64");
+ if (getTriple().getEnvironment() == llvm::Triple::ABI32 ||
+ getTriple().getEnvironment() == llvm::Triple::GNUABI32 ||
+ getTriple().getEnvironment() == llvm::Triple::AndroidABI32)
+ setABI("o32");
+ else if (getTriple().getEnvironment() == llvm::Triple::ABIN32 ||
+ getTriple().getEnvironment() == llvm::Triple::GNUABIN32)
+ setABI("n32");
+ else if (getTriple().getEnvironment() == llvm::Triple::ABI64 ||
+ getTriple().getEnvironment() == llvm::Triple::GNUABI64 ||
+ getTriple().getEnvironment() == llvm::Triple::AndroidABI64)
+ setABI("n64");
+ else
+ setABI((getTriple().getArch() == llvm::Triple::mips ||
+ getTriple().getArch() == llvm::Triple::mipsel)
+ ? "o32"
+ : "n64");
CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
}
@@ -7174,17 +7186,20 @@
if (Name == "o32") {
setO32ABITypes();
ABI = Name;
+ setDataLayout();
return true;
}
if (Name == "n32") {
setN32ABITypes();
ABI = Name;
+ setDataLayout();
return true;
}
if (Name == "n64") {
setN64ABITypes();
ABI = Name;
+ setDataLayout();
return true;
}
return false;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits