diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-05-12 11:31:19 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-05-12 11:31:19 +0000 |
commit | 415c159e0966085c3d59f7652d2e85a07e39d67d (patch) | |
tree | dc0014d665b24a85c4da8c7dd735b60e13409936 /llvm/lib/Target/Mips | |
parent | a166979e450485af61b24eb54687ea50055683e7 (diff) | |
download | bcm5719-llvm-415c159e0966085c3d59f7652d2e85a07e39d67d.tar.gz bcm5719-llvm-415c159e0966085c3d59f7652d2e85a07e39d67d.zip |
[mips][ias] Correct ELF eflags when Octeon is the target.
Reviewers: sdardis
Subscribers: petarj, mpf, dsanders, spetrovic, llvm-commits, sdardis
Differential Revision: http://reviews.llvm.org/D18899
llvm-svn: 269283
Diffstat (limited to 'llvm/lib/Target/Mips')
3 files changed, 28 insertions, 15 deletions
diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp index 70b9cca8cf6..932d38a0b9f 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.cpp @@ -53,17 +53,17 @@ uint8_t MipsABIFlagsSection::getCPR1SizeValue() { namespace llvm { MCStreamer &operator<<(MCStreamer &OS, MipsABIFlagsSection &ABIFlagsSection) { // Write out a Elf_Internal_ABIFlags_v0 struct - OS.EmitIntValue(ABIFlagsSection.getVersionValue(), 2); // version - OS.EmitIntValue(ABIFlagsSection.getISALevelValue(), 1); // isa_level - OS.EmitIntValue(ABIFlagsSection.getISARevisionValue(), 1); // isa_rev - OS.EmitIntValue(ABIFlagsSection.getGPRSizeValue(), 1); // gpr_size - OS.EmitIntValue(ABIFlagsSection.getCPR1SizeValue(), 1); // cpr1_size - OS.EmitIntValue(ABIFlagsSection.getCPR2SizeValue(), 1); // cpr2_size - OS.EmitIntValue(ABIFlagsSection.getFpABIValue(), 1); // fp_abi - OS.EmitIntValue(ABIFlagsSection.getISAExtensionSetValue(), 4); // isa_ext - OS.EmitIntValue(ABIFlagsSection.getASESetValue(), 4); // ases - OS.EmitIntValue(ABIFlagsSection.getFlags1Value(), 4); // flags1 - OS.EmitIntValue(ABIFlagsSection.getFlags2Value(), 4); // flags2 + OS.EmitIntValue(ABIFlagsSection.getVersionValue(), 2); // version + OS.EmitIntValue(ABIFlagsSection.getISALevelValue(), 1); // isa_level + OS.EmitIntValue(ABIFlagsSection.getISARevisionValue(), 1); // isa_rev + OS.EmitIntValue(ABIFlagsSection.getGPRSizeValue(), 1); // gpr_size + OS.EmitIntValue(ABIFlagsSection.getCPR1SizeValue(), 1); // cpr1_size + OS.EmitIntValue(ABIFlagsSection.getCPR2SizeValue(), 1); // cpr2_size + OS.EmitIntValue(ABIFlagsSection.getFpABIValue(), 1); // fp_abi + OS.EmitIntValue(ABIFlagsSection.getISAExtensionValue(), 4); // isa_ext + OS.EmitIntValue(ABIFlagsSection.getASESetValue(), 4); // ases + OS.EmitIntValue(ABIFlagsSection.getFlags1Value(), 4); // flags1 + OS.EmitIntValue(ABIFlagsSection.getFlags2Value(), 4); // flags2 return OS; } } diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h b/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h index b078cd30a87..3966cae9fe3 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsABIFlagsSection.h @@ -35,7 +35,7 @@ struct MipsABIFlagsSection { // The size of co-processor 2 registers. Mips::AFL_REG CPR2Size; // Processor-specific extension. - uint32_t ISAExtensionSet; + Mips::AFL_EXT ISAExtension; // Mask of ASEs used. uint32_t ASESet; @@ -51,8 +51,8 @@ public: MipsABIFlagsSection() : Version(0), ISALevel(0), ISARevision(0), GPRSize(Mips::AFL_REG_NONE), CPR1Size(Mips::AFL_REG_NONE), CPR2Size(Mips::AFL_REG_NONE), - ISAExtensionSet(0), ASESet(0), OddSPReg(false), Is32BitABI(false), - FpABI(FpABIKind::ANY) {} + ISAExtension(Mips::AFL_EXT_NONE), ASESet(0), OddSPReg(false), + Is32BitABI(false), FpABI(FpABIKind::ANY) {} uint16_t getVersionValue() { return (uint16_t)Version; } uint8_t getISALevelValue() { return (uint8_t)ISALevel; } @@ -61,7 +61,7 @@ public: uint8_t getCPR1SizeValue(); uint8_t getCPR2SizeValue() { return (uint8_t)CPR2Size; } uint8_t getFpABIValue(); - uint32_t getISAExtensionSetValue() { return (uint32_t)ISAExtensionSet; } + uint32_t getISAExtensionValue() { return (uint32_t)ISAExtension; } uint32_t getASESetValue() { return (uint32_t)ASESet; } uint32_t getFlags1Value() { @@ -141,6 +141,14 @@ public: } template <class PredicateLibrary> + void setISAExtensionFromPredicates(const PredicateLibrary &P) { + if (P.hasCnMips()) + ISAExtension = Mips::AFL_EXT_OCTEON; + else + ISAExtension = Mips::AFL_EXT_NONE; + } + + template <class PredicateLibrary> void setASESetFromPredicates(const PredicateLibrary &P) { ASESet = 0; if (P.hasDSP()) @@ -179,6 +187,7 @@ public: setISALevelAndRevisionFromPredicates(P); setGPRSizeFromPredicates(P); setCPR1SizeFromPredicates(P); + setISAExtensionFromPredicates(P); setASESetFromPredicates(P); setFpAbiFromPredicates(P); OddSPReg = P.useOddSPReg(); diff --git a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp index 05c1026c25c..c9e240c7fb3 100644 --- a/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp +++ b/llvm/lib/Target/Mips/MCTargetDesc/MipsTargetStreamer.cpp @@ -707,6 +707,10 @@ MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S, else EFlags |= ELF::EF_MIPS_ARCH_1; + // Machine + if (Features[Mips::FeatureCnMips]) + EFlags |= ELF::EF_MIPS_MACH_OCTEON; + // Other options. if (Features[Mips::FeatureNaN2008]) EFlags |= ELF::EF_MIPS_NAN2008; |