diff options
author | Jack Carter <jcarter@mips.com> | 2013-02-05 09:30:03 +0000 |
---|---|---|
committer | Jack Carter <jcarter@mips.com> | 2013-02-05 09:30:03 +0000 |
commit | 7304702ef99f98897d15baae0eede55f294bc602 (patch) | |
tree | 750793287d42bb3070187a37950417ce33c547a7 | |
parent | 37ef65b9c1b93c386d13089d9ace6a1cc00e82dc (diff) |
This patch that sets the Mips ELF header flag for
MicroMips architectures.
Contributer: Zoran Jovanovic
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174360 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Support/ELF.h | 3 | ||||
-rw-r--r-- | lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp | 3 | ||||
-rw-r--r-- | lib/Target/Mips/Mips.td | 3 | ||||
-rw-r--r-- | lib/Target/Mips/MipsSubtarget.cpp | 3 | ||||
-rw-r--r-- | lib/Target/Mips/MipsSubtarget.h | 4 | ||||
-rw-r--r-- | test/MC/Mips/elf_eflags.ll | 8 |
6 files changed, 22 insertions, 2 deletions
diff --git a/include/llvm/Support/ELF.h b/include/llvm/Support/ELF.h index a1b8f54448..2c831a691b 100644 --- a/include/llvm/Support/ELF.h +++ b/include/llvm/Support/ELF.h @@ -747,7 +747,8 @@ enum { EF_MIPS_ARCH_64 = 0x60000000, // MIPS64 instruction set per linux not elf.h EF_MIPS_ARCH_32R2 = 0x70000000, // mips32r2 EF_MIPS_ARCH_64R2 = 0x80000000, // mips64r2 - EF_MIPS_ARCH = 0xf0000000 // Mask for applying EF_MIPS_ARCH_ variant + EF_MIPS_ARCH = 0xf0000000, // Mask for applying EF_MIPS_ARCH_ variant + EF_MIPS_MICROMIPS = 0x02000000 // microMIPS }; // ELF Relocation types for Mips diff --git a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp index 89891ff7f9..9c454d6169 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp @@ -45,6 +45,9 @@ namespace llvm { else EFlags |= ELF::EF_MIPS_ARCH_32; + if (Subtarget.inMicroMipsMode()) + EFlags |= ELF::EF_MIPS_MICROMIPS; + // Relocation Model Reloc::Model RM = Subtarget.getRelocationModel(); if (RM == Reloc::PIC_ || RM == Reloc::Default) diff --git a/lib/Target/Mips/Mips.td b/lib/Target/Mips/Mips.td index 23e2a948a5..13266233dd 100644 --- a/lib/Target/Mips/Mips.td +++ b/lib/Target/Mips/Mips.td @@ -80,6 +80,9 @@ def FeatureDSP : SubtargetFeature<"dsp", "HasDSP", "true", "Mips DSP ASE">; def FeatureDSPR2 : SubtargetFeature<"dspr2", "HasDSPR2", "true", "Mips DSP-R2 ASE", [FeatureDSP]>; +def FeatureMicroMips : SubtargetFeature<"micromips", "InMicroMipsMode", "true", + "microMips mode">; + //===----------------------------------------------------------------------===// // Mips processors supported. //===----------------------------------------------------------------------===// diff --git a/lib/Target/Mips/MipsSubtarget.cpp b/lib/Target/Mips/MipsSubtarget.cpp index 6ad97db762..75b4c98a9f 100644 --- a/lib/Target/Mips/MipsSubtarget.cpp +++ b/lib/Target/Mips/MipsSubtarget.cpp @@ -32,7 +32,8 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU, IsSingleFloat(false), IsFP64bit(false), IsGP64bit(false), HasVFPU(false), IsLinux(true), HasSEInReg(false), HasCondMov(false), HasSwap(false), HasBitCount(false), HasFPIdx(false), - InMips16Mode(false), HasDSP(false), HasDSPR2(false), IsAndroid(false), RM(_RM) + InMips16Mode(false), InMicroMipsMode(false), HasDSP(false), HasDSPR2(false), + IsAndroid(false), RM(_RM) { std::string CPUName = CPU; if (CPUName.empty()) diff --git a/lib/Target/Mips/MipsSubtarget.h b/lib/Target/Mips/MipsSubtarget.h index 63cde8d668..32baa3d85a 100644 --- a/lib/Target/Mips/MipsSubtarget.h +++ b/lib/Target/Mips/MipsSubtarget.h @@ -89,6 +89,9 @@ protected: // InMips16 -- can process Mips16 instructions bool InMips16Mode; + // InMicroMips -- can process MicroMips instructions + bool InMicroMipsMode; + // HasDSP, HasDSPR2 -- supports DSP ASE. bool HasDSP, HasDSPR2; @@ -138,6 +141,7 @@ public: bool isNotSingleFloat() const { return !IsSingleFloat; } bool hasVFPU() const { return HasVFPU; } bool inMips16Mode() const { return InMips16Mode; } + bool inMicroMipsMode() const { return InMicroMipsMode; } bool hasDSP() const { return HasDSP; } bool hasDSPR2() const { return HasDSPR2; } bool isAndroid() const { return IsAndroid; } diff --git a/test/MC/Mips/elf_eflags.ll b/test/MC/Mips/elf_eflags.ll index 4f29c72345..bb7857dd0f 100644 --- a/test/MC/Mips/elf_eflags.ll +++ b/test/MC/Mips/elf_eflags.ll @@ -17,6 +17,8 @@ ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32_PIC %s ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2 %s ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2_PIC %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS %s +; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+micromips %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32R2-MICROMIPS_PIC %s ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64 %s ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64_PIC %s @@ -36,6 +38,12 @@ ; 32R2 bit with NO_REORDER and PIC ; CHECK-BE32R2_PIC: ('e_flags', 0x70000003) ; +; 32R2 bit MICROMIPS with NO_REORDER and static +; CHECK-BE32R2-MICROMIPS: ('e_flags', 0x72000001) +; +; 32R2 bit MICROMIPS with NO_REORDER and PIC +;CHECK-BE32R2-MICROMIPS_PIC: ('e_flags', 0x72000003) +; ; 64(R1) bit with NO_REORDER and static ; CHECK-BE64: ('e_flags', 0x60000001) ; |