summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Atanasyan <simon@atanasyan.com>2015-04-21 17:02:35 +0000
committerSimon Atanasyan <simon@atanasyan.com>2015-04-21 17:02:35 +0000
commitfcb19e19d0412f7986d158578b13d11858cf253c (patch)
tree4e58259ca2ef140cee25639500bab4ce9a6012e2
parentd64f8a5188d953a50f1153ed26631030e7d75bf5 (diff)
downloadbcm5719-llvm-fcb19e19d0412f7986d158578b13d11858cf253c.tar.gz
bcm5719-llvm-fcb19e19d0412f7986d158578b13d11858cf253c.zip
[Mips] Write .reginfo section into the separate PT_MIPS_REGINFO segment
llvm-svn: 235391
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h6
-rw-r--r--lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h14
-rw-r--r--lld/lib/ReaderWriter/ELF/SectionChunks.h2
-rw-r--r--lld/test/elf/Mips/reginfo-02.test15
4 files changed, 34 insertions, 3 deletions
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h b/lld/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h
index cb5d612fed6..9d3040701f7 100644
--- a/lld/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h
+++ b/lld/lib/ReaderWriter/ELF/Mips/MipsSectionChunks.h
@@ -26,7 +26,7 @@ public:
const MipsReginfo &reginfo)
: Section<ELFT>(ctx, ".reginfo", "MipsReginfo"),
_targetLayout(targetLayout) {
- this->setOrder(MipsTargetLayout<ELFT>::ORDER_RO_NOTE);
+ this->setOrder(MipsTargetLayout<ELFT>::ORDER_MIPS_REGINFO);
this->_entSize = sizeof(Elf_RegInfo);
this->_fsize = sizeof(Elf_RegInfo);
this->_msize = sizeof(Elf_RegInfo);
@@ -42,6 +42,10 @@ public:
_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,
llvm::FileOutputBuffer &buffer) override {
uint8_t *dest = buffer.getBufferStart() + this->fileOffset();
diff --git a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h
index 5d283488cc7..3fc8ba7a51d 100644
--- a/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h
+++ b/lld/lib/ReaderWriter/ELF/Mips/MipsTargetLayout.h
@@ -20,6 +20,10 @@ class MipsLinkingContext;
/// \brief TargetLayout for Mips
template <class ELFT> class MipsTargetLayout final : public TargetLayout<ELFT> {
public:
+ enum MipsSectionOrder {
+ ORDER_MIPS_REGINFO = TargetLayout<ELFT>::ORDER_RO_NOTE + 1
+ };
+
MipsTargetLayout(MipsLinkingContext &ctx)
: TargetLayout<ELFT>(ctx),
_gotSection(new (this->_allocator) MipsGOTSection<ELFT>(ctx)),
@@ -39,6 +43,16 @@ public:
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.
uint64_t getGPOffset() const { return 0x7FF0; }
diff --git a/lld/lib/ReaderWriter/ELF/SectionChunks.h b/lld/lib/ReaderWriter/ELF/SectionChunks.h
index 7b78e265cd7..2c8fe280a5e 100644
--- a/lld/lib/ReaderWriter/ELF/SectionChunks.h
+++ b/lld/lib/ReaderWriter/ELF/SectionChunks.h
@@ -73,7 +73,7 @@ public:
/// \brief convert the segment type to a String for diagnostics and printing
/// purposes
- StringRef segmentKindToStr() const;
+ virtual StringRef segmentKindToStr() const;
/// \brief Records the segmentType, that this section belongs to
void
diff --git a/lld/test/elf/Mips/reginfo-02.test b/lld/test/elf/Mips/reginfo-02.test
index 2b7c207a799..65651ce41cb 100644
--- a/lld/test/elf/Mips/reginfo-02.test
+++ b/lld/test/elf/Mips/reginfo-02.test
@@ -3,7 +3,7 @@
# RUN: yaml2obj -format=elf -docnum 1 %s > %t1.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: 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
# SEC: Index: 1
@@ -20,6 +20,19 @@
# SEC-NEXT: AddressAlignment: 4
# 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-NEXT: {{[0-9a-f]+}} f0000001 e0000002 d0000003 c0000004
# RAW-NEXT: {{[0-9a-f]+}} b0000005 f08f0000
OpenPOWER on IntegriCloud