[Mips] Emit ELF header for MIPS target. ELF flags set is mostly hardcoded.

Later we need to improve that solution and build a correct set of flags
by merging ELF flags from all input objects.

llvm-svn: 199555
This commit is contained in:
Simon Atanasyan 2014-01-18 16:59:11 +00:00
parent 0e57a77072
commit 2f1d6366e7
4 changed files with 84 additions and 1 deletions

View File

@ -127,6 +127,27 @@ uint64_t MipsTargetHandler::getGPDispSymAddr() const {
return _gpDispSymAtom ? _gpDispSymAtom->_virtualAddr : 0; return _gpDispSymAtom ? _gpDispSymAtom->_virtualAddr : 0;
} }
bool MipsTargetHandler::doesOverrideELFHeader() { return true; }
void MipsTargetHandler::setELFHeader(ELFHeader<Mips32ElELFType> *elfHeader) {
elfHeader->e_version(1);
elfHeader->e_ident(llvm::ELF::EI_VERSION, llvm::ELF::EV_CURRENT);
elfHeader->e_ident(llvm::ELF::EI_OSABI, llvm::ELF::ELFOSABI_NONE);
if (_targetLayout.findOutputSection(".got.plt"))
elfHeader->e_ident(llvm::ELF::EI_ABIVERSION, 1);
else
elfHeader->e_ident(llvm::ELF::EI_ABIVERSION, 0);
// FIXME (simon): Read elf flags from all inputs, check compatibility,
// merge them and write result here.
uint32_t flags = llvm::ELF::EF_MIPS_NOREORDER | llvm::ELF::EF_MIPS_ABI_O32 |
llvm::ELF::EF_MIPS_CPIC | llvm::ELF::EF_MIPS_ARCH_32R2;
if (_context.getOutputELFType() == llvm::ELF::ET_DYN)
flags |= EF_MIPS_PIC;
elfHeader->e_flags(flags);
}
MipsTargetLayout<Mips32ElELFType> &MipsTargetHandler::targetLayout() { MipsTargetLayout<Mips32ElELFType> &MipsTargetHandler::targetLayout() {
return _targetLayout; return _targetLayout;
} }

View File

@ -54,6 +54,8 @@ public:
uint64_t getGPDispSymAddr() const; uint64_t getGPDispSymAddr() const;
virtual bool doesOverrideELFHeader();
virtual void setELFHeader(ELFHeader<Mips32ElELFType> *elfHeader);
virtual MipsTargetLayout<Mips32ElELFType> &targetLayout(); virtual MipsTargetLayout<Mips32ElELFType> &targetLayout();
virtual const MipsTargetRelocationHandler &getRelocationHandler() const; virtual const MipsTargetRelocationHandler &getRelocationHandler() const;
virtual LLD_UNIQUE_BUMP_PTR(DynamicTable<Mips32ElELFType>) virtual LLD_UNIQUE_BUMP_PTR(DynamicTable<Mips32ElELFType>)

View File

@ -22,7 +22,13 @@ CHECK: Version: 1
CHECK: Entry: 0x170 CHECK: Entry: 0x170
CHECK: ProgramHeaderOffset: 0x34 CHECK: ProgramHeaderOffset: 0x34
CHECK: SectionHeaderOffset: 0x21D8 CHECK: SectionHeaderOffset: 0x21D8
CHECK: Flags [ (0x0) CHECK: Flags [ (0x70001007)
CHECK: 0x1
CHECK: 0x2
CHECK: 0x1000
CHECK: 0x10000000
CHECK: 0x20000000
CHECK: 0x40000000
CHECK: ] CHECK: ]
CHECK: HeaderSize: 52 CHECK: HeaderSize: 52
CHECK: ProgramHeaderEntrySize: 32 CHECK: ProgramHeaderEntrySize: 32

View File

@ -0,0 +1,54 @@
# Check ELF Header for non-pic executable file.
# Build shared library
# RUN: llvm-mc -triple=mipsel -filetype=obj -relocation-model=pic \
# RUN: -o=%t-obj %p/Inputs/ext.s
# RUN: lld -flavor gnu -target mipsel -shared -o %t-so %t-obj
# Build executable
# RUN: llvm-mc -triple=mipsel -filetype=obj -o=%t-obj %s
# RUN: lld -flavor gnu -target mipsel -e glob -o %t-exe %t-obj %t-so
# RUN: llvm-readobj -file-headers %t-exe | FileCheck %s
# CHECK: Format: ELF32-mips
# CHECK: Arch: mipsel
# CHECK: AddressSize: 32bit
# CHECK: LoadName:
# CHECK: ElfHeader {
# CHECK: Ident {
# CHECK: Magic: (7F 45 4C 46)
# CHECK: Class: 32-bit (0x1)
# CHECK: DataEncoding: LittleEndian (0x1)
# CHECK: FileVersion: 1
# CHECK: OS/ABI: SystemV (0x0)
# CHECK: ABIVersion: 1
# CHECK: Unused: (00 00 00 00 00 00 00)
# CHECK: }
# CHECK: Type: Executable (0x2)
# CHECK: Machine: EM_MIPS (0x8)
# CHECK: Version: 1
# CHECK: Entry: 0x4001B0
# CHECK: ProgramHeaderOffset: 0x34
# CHECK: SectionHeaderOffset: 0x2268
# CHECK: Flags [ (0x70001005)
# CHECK: 0x1
# CHECK: 0x4
# CHECK: 0x1000
# CHECK: 0x10000000
# CHECK: 0x20000000
# CHECK: 0x40000000
# CHECK: ]
# CHECK: HeaderSize: 52
# CHECK: ProgramHeaderEntrySize: 32
# CHECK: ProgramHeaderCount: 6
# CHECK: SectionHeaderEntrySize: 40
# CHECK: SectionHeaderCount: 16
# CHECK: StringTableSectionIndex: 13
# CHECK: }
.abicalls
.global glob
.ent glob
glob:
jal ext1
.end glob