[Mips] Write .reginfo section into the separate PT_MIPS_REGINFO segment
llvm-svn: 235391
This commit is contained in:
parent
d64f8a5188
commit
fcb19e19d0
|
|
@ -26,7 +26,7 @@ public:
|
||||||
const MipsReginfo ®info)
|
const MipsReginfo ®info)
|
||||||
: Section<ELFT>(ctx, ".reginfo", "MipsReginfo"),
|
: Section<ELFT>(ctx, ".reginfo", "MipsReginfo"),
|
||||||
_targetLayout(targetLayout) {
|
_targetLayout(targetLayout) {
|
||||||
this->setOrder(MipsTargetLayout<ELFT>::ORDER_RO_NOTE);
|
this->setOrder(MipsTargetLayout<ELFT>::ORDER_MIPS_REGINFO);
|
||||||
this->_entSize = sizeof(Elf_RegInfo);
|
this->_entSize = sizeof(Elf_RegInfo);
|
||||||
this->_fsize = sizeof(Elf_RegInfo);
|
this->_fsize = sizeof(Elf_RegInfo);
|
||||||
this->_msize = sizeof(Elf_RegInfo);
|
this->_msize = sizeof(Elf_RegInfo);
|
||||||
|
|
@ -42,6 +42,10 @@ public:
|
||||||
_reginfo.ri_cprmask[3] = reginfo._cpRegMask[3];
|
_reginfo.ri_cprmask[3] = reginfo._cpRegMask[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StringRef segmentKindToStr() const override { return "REGINFO"; }
|
||||||
|
|
||||||
|
bool hasOutputSegment() const override { return true; }
|
||||||
|
|
||||||
void write(ELFWriter *writer, TargetLayout<ELFT> &layout,
|
void write(ELFWriter *writer, TargetLayout<ELFT> &layout,
|
||||||
llvm::FileOutputBuffer &buffer) override {
|
llvm::FileOutputBuffer &buffer) override {
|
||||||
uint8_t *dest = buffer.getBufferStart() + this->fileOffset();
|
uint8_t *dest = buffer.getBufferStart() + this->fileOffset();
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,10 @@ class MipsLinkingContext;
|
||||||
/// \brief TargetLayout for Mips
|
/// \brief TargetLayout for Mips
|
||||||
template <class ELFT> class MipsTargetLayout final : public TargetLayout<ELFT> {
|
template <class ELFT> class MipsTargetLayout final : public TargetLayout<ELFT> {
|
||||||
public:
|
public:
|
||||||
|
enum MipsSectionOrder {
|
||||||
|
ORDER_MIPS_REGINFO = TargetLayout<ELFT>::ORDER_RO_NOTE + 1
|
||||||
|
};
|
||||||
|
|
||||||
MipsTargetLayout(MipsLinkingContext &ctx)
|
MipsTargetLayout(MipsLinkingContext &ctx)
|
||||||
: TargetLayout<ELFT>(ctx),
|
: TargetLayout<ELFT>(ctx),
|
||||||
_gotSection(new (this->_allocator) MipsGOTSection<ELFT>(ctx)),
|
_gotSection(new (this->_allocator) MipsGOTSection<ELFT>(ctx)),
|
||||||
|
|
@ -39,6 +43,16 @@ public:
|
||||||
return TargetLayout<ELFT>::createSection(name, type, permissions, order);
|
return TargetLayout<ELFT>::createSection(name, type, permissions, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typename TargetLayout<ELFT>::SegmentType
|
||||||
|
getSegmentType(Section<ELFT> *section) const override {
|
||||||
|
switch (section->order()) {
|
||||||
|
case ORDER_MIPS_REGINFO:
|
||||||
|
return llvm::ELF::PT_MIPS_REGINFO;
|
||||||
|
default:
|
||||||
|
return TargetLayout<ELFT>::getSegmentType(section);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// \brief GP offset relative to .got section.
|
/// \brief GP offset relative to .got section.
|
||||||
uint64_t getGPOffset() const { return 0x7FF0; }
|
uint64_t getGPOffset() const { return 0x7FF0; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ public:
|
||||||
|
|
||||||
/// \brief convert the segment type to a String for diagnostics and printing
|
/// \brief convert the segment type to a String for diagnostics and printing
|
||||||
/// purposes
|
/// purposes
|
||||||
StringRef segmentKindToStr() const;
|
virtual StringRef segmentKindToStr() const;
|
||||||
|
|
||||||
/// \brief Records the segmentType, that this section belongs to
|
/// \brief Records the segmentType, that this section belongs to
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
|
# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.o
|
||||||
# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
|
# RUN: yaml2obj -format=elf -docnum 2 %s > %t2.o
|
||||||
# RUN: lld -flavor gnu -target mipsel -shared -o %t.so %t1.o %t2.o
|
# RUN: lld -flavor gnu -target mipsel -shared -o %t.so %t1.o %t2.o
|
||||||
# RUN: llvm-readobj -s %t.so | FileCheck -check-prefix=SEC %s
|
# RUN: llvm-readobj -program-headers -s %t.so | FileCheck -check-prefix=SEC %s
|
||||||
# RUN: llvm-objdump -s -t %t.so | FileCheck -check-prefix=RAW %s
|
# RUN: llvm-objdump -s -t %t.so | FileCheck -check-prefix=RAW %s
|
||||||
|
|
||||||
# SEC: Index: 1
|
# SEC: Index: 1
|
||||||
|
|
@ -20,6 +20,19 @@
|
||||||
# SEC-NEXT: AddressAlignment: 4
|
# SEC-NEXT: AddressAlignment: 4
|
||||||
# SEC-NEXT: EntrySize: 24
|
# SEC-NEXT: EntrySize: 24
|
||||||
|
|
||||||
|
# SEC: ProgramHeader {
|
||||||
|
# SEC: Type: PT_MIPS_REGINFO (0x70000000)
|
||||||
|
# SEC-NEXT: Offset: 0x{{[0-9A-F]+}}
|
||||||
|
# SEC-NEXT: VirtualAddress: 0x{{[0-9A-F]+}}
|
||||||
|
# SEC-NEXT: PhysicalAddress: 0x{{[0-9A-F]+}}
|
||||||
|
# SEC-NEXT: FileSize: 24
|
||||||
|
# SEC-NEXT: MemSize: 24
|
||||||
|
# SEC-NEXT: Flags [ (0x4)
|
||||||
|
# SEC-NEXT: PF_R (0x4)
|
||||||
|
# SEC-NEXT: ]
|
||||||
|
# SEC-NEXT: Alignment: 4
|
||||||
|
# SEC-NEXT: }
|
||||||
|
|
||||||
# RAW: Contents of section .reginfo:
|
# RAW: Contents of section .reginfo:
|
||||||
# RAW-NEXT: {{[0-9a-f]+}} f0000001 e0000002 d0000003 c0000004
|
# RAW-NEXT: {{[0-9a-f]+}} f0000001 e0000002 d0000003 c0000004
|
||||||
# RAW-NEXT: {{[0-9a-f]+}} b0000005 f08f0000
|
# RAW-NEXT: {{[0-9a-f]+}} b0000005 f08f0000
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue