mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
This patch implements runtime Mips specific
setting of ELF header e_flags. Contributer: Jack Carter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173884 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9a7bf438b5
commit
dba14301f0
61
lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp
Normal file
61
lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
//===-- MipsELFStreamer.cpp - MipsELFStreamer ---------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===-------------------------------------------------------------------===//
|
||||||
|
#include "MCTargetDesc/MipsELFStreamer.h"
|
||||||
|
#include "MipsSubtarget.h"
|
||||||
|
#include "llvm/MC/MCAssembler.h"
|
||||||
|
#include "llvm/Support/ELF.h"
|
||||||
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
MCELFStreamer* createMipsELFStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||||
|
raw_ostream &OS, MCCodeEmitter *Emitter,
|
||||||
|
bool RelaxAll, bool NoExecStack) {
|
||||||
|
MipsELFStreamer *S = new MipsELFStreamer(Context, TAB, OS, Emitter,
|
||||||
|
RelaxAll, NoExecStack);
|
||||||
|
return S;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For llc. Set a group of ELF header flags
|
||||||
|
void
|
||||||
|
MipsELFStreamer::emitELFHeaderFlagsCG(const MipsSubtarget &Subtarget) {
|
||||||
|
|
||||||
|
if (hasRawTextSupport())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Update e_header flags
|
||||||
|
MCAssembler& MCA = getAssembler();
|
||||||
|
unsigned EFlags = MCA.getELFHeaderEFlags();
|
||||||
|
|
||||||
|
EFlags |= ELF::EF_MIPS_NOREORDER;
|
||||||
|
|
||||||
|
// Architecture
|
||||||
|
if (Subtarget.hasMips64r2())
|
||||||
|
EFlags |= ELF::EF_MIPS_ARCH_64R2;
|
||||||
|
else if (Subtarget.hasMips64())
|
||||||
|
EFlags |= ELF::EF_MIPS_ARCH_64;
|
||||||
|
else if (Subtarget.hasMips32r2())
|
||||||
|
EFlags |= ELF::EF_MIPS_ARCH_32R2;
|
||||||
|
else
|
||||||
|
EFlags |= ELF::EF_MIPS_ARCH_32;
|
||||||
|
|
||||||
|
// Relocation Model
|
||||||
|
Reloc::Model RM = Subtarget.getRelocationModel();
|
||||||
|
if (RM == Reloc::PIC_ || RM == Reloc::Default)
|
||||||
|
EFlags |= ELF::EF_MIPS_PIC;
|
||||||
|
else if (RM == Reloc::Static)
|
||||||
|
; // Do nothing for Reloc::Static
|
||||||
|
else
|
||||||
|
llvm_unreachable("Unsupported relocation model for e_flags");
|
||||||
|
|
||||||
|
MCA.setELFHeaderEFlags(EFlags);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
37
lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h
Normal file
37
lib/Target/Mips/MCTargetDesc/MipsELFStreamer.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
//=== MipsELFStreamer.h - MipsELFStreamer ------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENCE.TXT for details.
|
||||||
|
//
|
||||||
|
//===-------------------------------------------------------------------===//
|
||||||
|
#ifndef MIPSELFSTREAMER_H_
|
||||||
|
#define MIPSELFSTREAMER_H_
|
||||||
|
|
||||||
|
#include "llvm/MC/MCELFStreamer.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
class MipsSubtarget;
|
||||||
|
|
||||||
|
class MipsELFStreamer : public MCELFStreamer {
|
||||||
|
private:
|
||||||
|
unsigned EFlags;
|
||||||
|
public:
|
||||||
|
MipsELFStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||||
|
raw_ostream &OS, MCCodeEmitter *Emitter,
|
||||||
|
bool RelaxAll, bool NoExecStack)
|
||||||
|
: MCELFStreamer(Context, TAB, OS, Emitter), EFlags(0) {
|
||||||
|
}
|
||||||
|
|
||||||
|
~MipsELFStreamer() {}
|
||||||
|
void emitELFHeaderFlagsCG(const MipsSubtarget &Subtarget);
|
||||||
|
// void emitELFHeaderFlagCG(unsigned Val);
|
||||||
|
};
|
||||||
|
|
||||||
|
MCELFStreamer* createMipsELFStreamer(MCContext &Context, MCAsmBackend &TAB,
|
||||||
|
raw_ostream &OS, MCCodeEmitter *Emitter,
|
||||||
|
bool RelaxAll, bool NoExecStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MIPSELFSTREAMER_H_ */
|
@ -11,6 +11,7 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "MCTargetDesc/MipsELFStreamer.h"
|
||||||
#include "MipsMCTargetDesc.h"
|
#include "MipsMCTargetDesc.h"
|
||||||
#include "InstPrinter/MipsInstPrinter.h"
|
#include "InstPrinter/MipsInstPrinter.h"
|
||||||
#include "MipsMCAsmInfo.h"
|
#include "MipsMCAsmInfo.h"
|
||||||
@ -131,7 +132,7 @@ static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
|
|||||||
bool NoExecStack) {
|
bool NoExecStack) {
|
||||||
Triple TheTriple(TT);
|
Triple TheTriple(TT);
|
||||||
|
|
||||||
return createELFStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll, NoExecStack);
|
return createMipsELFStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll, NoExecStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void LLVMInitializeMipsTargetMC() {
|
extern "C" void LLVMInitializeMipsTargetMC() {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#define DEBUG_TYPE "mips-asm-printer"
|
#define DEBUG_TYPE "mips-asm-printer"
|
||||||
#include "InstPrinter/MipsInstPrinter.h"
|
#include "InstPrinter/MipsInstPrinter.h"
|
||||||
#include "MCTargetDesc/MipsBaseInfo.h"
|
#include "MCTargetDesc/MipsBaseInfo.h"
|
||||||
|
#include "MCTargetDesc/MipsELFStreamer.h"
|
||||||
#include "Mips.h"
|
#include "Mips.h"
|
||||||
#include "MipsAsmPrinter.h"
|
#include "MipsAsmPrinter.h"
|
||||||
#include "MipsInstrInfo.h"
|
#include "MipsInstrInfo.h"
|
||||||
@ -545,9 +546,13 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
|
|||||||
|
|
||||||
void MipsAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
void MipsAsmPrinter::EmitEndOfAsmFile(Module &M) {
|
||||||
|
|
||||||
|
if (OutStreamer.hasRawTextSupport()) return;
|
||||||
|
|
||||||
// Emit Mips ELF register info
|
// Emit Mips ELF register info
|
||||||
Subtarget->getMReginfo().emitMipsReginfoSectionCG(
|
Subtarget->getMReginfo().emitMipsReginfoSectionCG(
|
||||||
OutStreamer, getObjFileLowering(), *Subtarget);
|
OutStreamer, getObjFileLowering(), *Subtarget);
|
||||||
|
MipsELFStreamer & MES = static_cast<MipsELFStreamer &>(OutStreamer);
|
||||||
|
MES.emitELFHeaderFlagsCG(*Subtarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
MachineLocation
|
MachineLocation
|
||||||
|
@ -26,13 +26,13 @@ void MipsSubtarget::anchor() { }
|
|||||||
|
|
||||||
MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
||||||
const std::string &FS, bool little,
|
const std::string &FS, bool little,
|
||||||
Reloc::Model RM) :
|
Reloc::Model _RM) :
|
||||||
MipsGenSubtargetInfo(TT, CPU, FS),
|
MipsGenSubtargetInfo(TT, CPU, FS),
|
||||||
MipsArchVersion(Mips32), MipsABI(UnknownABI), IsLittle(little),
|
MipsArchVersion(Mips32), MipsABI(UnknownABI), IsLittle(little),
|
||||||
IsSingleFloat(false), IsFP64bit(false), IsGP64bit(false), HasVFPU(false),
|
IsSingleFloat(false), IsFP64bit(false), IsGP64bit(false), HasVFPU(false),
|
||||||
IsLinux(true), HasSEInReg(false), HasCondMov(false), HasSwap(false),
|
IsLinux(true), HasSEInReg(false), HasCondMov(false), HasSwap(false),
|
||||||
HasBitCount(false), HasFPIdx(false),
|
HasBitCount(false), HasFPIdx(false),
|
||||||
InMips16Mode(false), HasDSP(false), HasDSPR2(false), IsAndroid(false)
|
InMips16Mode(false), HasDSP(false), HasDSPR2(false), IsAndroid(false), RM(_RM)
|
||||||
{
|
{
|
||||||
std::string CPUName = CPU;
|
std::string CPUName = CPU;
|
||||||
if (CPUName.empty())
|
if (CPUName.empty())
|
||||||
|
@ -100,6 +100,9 @@ protected:
|
|||||||
// The instance to the register info section object
|
// The instance to the register info section object
|
||||||
MipsReginfo MRI;
|
MipsReginfo MRI;
|
||||||
|
|
||||||
|
// Relocation Model
|
||||||
|
Reloc::Model RM;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
|
virtual bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
|
||||||
AntiDepBreakMode& Mode,
|
AntiDepBreakMode& Mode,
|
||||||
@ -152,6 +155,9 @@ public:
|
|||||||
|
|
||||||
// Grab MipsRegInfo object
|
// Grab MipsRegInfo object
|
||||||
const MipsReginfo &getMReginfo() const { return MRI; }
|
const MipsReginfo &getMReginfo() const { return MRI; }
|
||||||
|
|
||||||
|
// Grab relocation model
|
||||||
|
Reloc::Model getRelocationModel() const {return RM;}
|
||||||
};
|
};
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
||||||
|
55
test/MC/Mips/elf_eflags.ll
Normal file
55
test/MC/Mips/elf_eflags.ll
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
; This tests ELF EFLAGS setting with direct object.
|
||||||
|
; When the assembler is ready a .s file for it will
|
||||||
|
; be created.
|
||||||
|
|
||||||
|
; Non-shared (static) is the absence of pic and or cpic.
|
||||||
|
|
||||||
|
; EF_MIPS_NOREORDER (0x00000001) is always on by default currently
|
||||||
|
; EF_MIPS_PIC (0x00000002)
|
||||||
|
; EF_MIPS_CPIC (0x00000004) - not tested yet
|
||||||
|
; EF_MIPS_ABI2 (0x00000020) - n32 not tested yet
|
||||||
|
; EF_MIPS_ARCH_32 (0x50000000)
|
||||||
|
; EF_MIPS_ARCH_64 (0x60000000)
|
||||||
|
; EF_MIPS_ARCH_32R2 (0x70000000)
|
||||||
|
; EF_MIPS_ARCH_64R2 (0x80000000)
|
||||||
|
|
||||||
|
; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE32 %s
|
||||||
|
; 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=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
|
||||||
|
; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64r2 -relocation-model=static %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64R2 %s
|
||||||
|
; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips64r2 %s -o - | elf-dump --dump-section-data | FileCheck -check-prefix=CHECK-BE64R2_PIC %s
|
||||||
|
|
||||||
|
|
||||||
|
; 32(R1) bit with NO_REORDER and static
|
||||||
|
; CHECK-BE32: ('e_flags', 0x50000001)
|
||||||
|
;
|
||||||
|
; 32(R1) bit with NO_REORDER and PIC
|
||||||
|
; CHECK-BE32_PIC: ('e_flags', 0x50000003)
|
||||||
|
;
|
||||||
|
; 32R2 bit with NO_REORDER and static
|
||||||
|
; CHECK-BE32R2: ('e_flags', 0x70000001)
|
||||||
|
;
|
||||||
|
; 32R2 bit with NO_REORDER and PIC
|
||||||
|
; CHECK-BE32R2_PIC: ('e_flags', 0x70000003)
|
||||||
|
;
|
||||||
|
; 64(R1) bit with NO_REORDER and static
|
||||||
|
; CHECK-BE64: ('e_flags', 0x60000001)
|
||||||
|
;
|
||||||
|
; 64(R1) bit with NO_REORDER and PIC
|
||||||
|
; CHECK-BE64_PIC: ('e_flags', 0x60000003)
|
||||||
|
;
|
||||||
|
; 64R2 bit with NO_REORDER and static
|
||||||
|
; CHECK-BE64R2: ('e_flags', 0x80000001)
|
||||||
|
;
|
||||||
|
; 64R2 bit with NO_REORDER and PIC
|
||||||
|
; CHECK-BE64R2_PIC: ('e_flags', 0x80000003)
|
||||||
|
;
|
||||||
|
|
||||||
|
define i32 @main() nounwind {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user