[lld] r195893 - [PECOFF] Set section characteristics based /section options.
Rui Ueyama
ruiu at google.com
Wed Nov 27 15:44:58 PST 2013
Author: ruiu
Date: Wed Nov 27 17:44:58 2013
New Revision: 195893
URL: http://llvm.org/viewvc/llvm-project?rev=195893&view=rev
Log:
[PECOFF] Set section characteristics based /section options.
This is a patch to let the PECOFF writer to use the information passed
by the parser for /section option. The implementation of /section should
now be complete.
Added:
lld/trunk/test/pecoff/section-attribute.test
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
Modified: lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp?rev=195893&r1=195892&r2=195893&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/WriterPECOFF.cpp Wed Nov 27 17:44:58 2013
@@ -320,9 +320,9 @@ class GenericSectionChunk : public Secti
public:
virtual void write(uint8_t *fileBuffer);
- GenericSectionChunk(StringRef name,
+ GenericSectionChunk(const PECOFFLinkingContext &ctx, StringRef name,
const std::vector<const DefinedAtom *> &atoms)
- : SectionChunk(name, getCharacteristics(name, atoms)) {
+ : SectionChunk(name, getCharacteristics(ctx, name, atoms)) {
for (auto *a : atoms)
appendAtom(a);
_sectionHeader.VirtualSize = _size;
@@ -330,36 +330,13 @@ public:
}
private:
- uint32_t getCharacteristics(StringRef name,
+ uint32_t getCharacteristics(const PECOFFLinkingContext &ctx, StringRef name,
const std::vector<const DefinedAtom *> &atoms) {
- const uint32_t code = llvm::COFF::IMAGE_SCN_CNT_CODE;
- const uint32_t execute = llvm::COFF::IMAGE_SCN_MEM_EXECUTE;
- const uint32_t read = llvm::COFF::IMAGE_SCN_MEM_READ;
- const uint32_t write = llvm::COFF::IMAGE_SCN_MEM_WRITE;
- const uint32_t data = llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA;
- const uint32_t bss = llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
- if (name == ".text")
- return code | execute | read;
- if (name == ".data")
- return data | read | write;
- if (name == ".rdata")
- return data | read;
- if (name == ".bss")
- return bss | read | write;
- assert(atoms.size() > 0);
- switch (atoms[0]->permissions()) {
- case DefinedAtom::permR__:
- return data | read;
- case DefinedAtom::permRW_:
- return data | read | write;
- case DefinedAtom::permR_X:
- return code | execute | read;
- case DefinedAtom::permRWX:
- return code | execute | read | write;
- default:
- llvm_unreachable("Unsupported permission");
- }
+ return ctx.getSectionAttributes(name, getDefaultCharacteristics(name, atoms));
}
+
+ uint32_t getDefaultCharacteristics(
+ StringRef name, const std::vector<const DefinedAtom *> &atoms);
};
/// A BaseRelocAtom represents a base relocation block in ".reloc" section.
@@ -714,6 +691,37 @@ void GenericSectionChunk::write(uint8_t
SectionChunk::write(fileBuffer);
}
+uint32_t GenericSectionChunk::getDefaultCharacteristics(
+ StringRef name, const std::vector<const DefinedAtom *> &atoms) {
+ const uint32_t code = llvm::COFF::IMAGE_SCN_CNT_CODE;
+ const uint32_t execute = llvm::COFF::IMAGE_SCN_MEM_EXECUTE;
+ const uint32_t read = llvm::COFF::IMAGE_SCN_MEM_READ;
+ const uint32_t write = llvm::COFF::IMAGE_SCN_MEM_WRITE;
+ const uint32_t data = llvm::COFF::IMAGE_SCN_CNT_INITIALIZED_DATA;
+ const uint32_t bss = llvm::COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
+ if (name == ".text")
+ return code | execute | read;
+ if (name == ".data")
+ return data | read | write;
+ if (name == ".rdata")
+ return data | read;
+ if (name == ".bss")
+ return bss | read | write;
+ assert(atoms.size() > 0);
+ switch (atoms[0]->permissions()) {
+ case DefinedAtom::permR__:
+ return data | read;
+ case DefinedAtom::permRW_:
+ return data | read | write;
+ case DefinedAtom::permR_X:
+ return code | execute | read;
+ case DefinedAtom::permRWX:
+ return code | execute | read | write;
+ default:
+ llvm_unreachable("Unsupported permission");
+ }
+}
+
void SectionHeaderTableChunk::addSection(SectionChunk *chunk) {
_sections.push_back(chunk);
}
@@ -925,7 +933,8 @@ void ExecutableWriter::build(const File
for (auto i : atoms) {
StringRef sectionName = i.first;
std::vector<const DefinedAtom *> &contents = i.second;
- auto *section = new GenericSectionChunk(sectionName, contents);
+ auto *section = new GenericSectionChunk(_PECOFFLinkingContext, sectionName,
+ contents);
addSectionChunk(section, sectionTable);
if (!text && sectionName == ".text")
Added: lld/trunk/test/pecoff/section-attribute.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/section-attribute.test?rev=195893&view=auto
==============================================================================
--- lld/trunk/test/pecoff/section-attribute.test (added)
+++ lld/trunk/test/pecoff/section-attribute.test Wed Nov 27 17:44:58 2013
@@ -0,0 +1,45 @@
+# RUN: yaml2obj %p/Inputs/nonstandard-sections.obj.yaml > %t.obj
+# RUN: lld -flavor link /out:%t.exe /subsystem:console /force \
+# RUN: /section:.foo,d /section:.bar,rw /section:.text,rwe -- %t.obj
+# RUN: llvm-readobj -sections %t.exe | FileCheck %s
+
+CHECK: Sections [
+CHECK: Section {
+CHECK: Number: 1
+CHECK: Name: .bar (2E 62 61 72 00 00 00 00)
+CHECK: Characteristics [ (0xC0000040)
+CHECK: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
+CHECK: IMAGE_SCN_MEM_READ (0x40000000)
+CHECK: IMAGE_SCN_MEM_WRITE (0x80000000)
+CHECK: ]
+CHECK: }
+CHECK: Section {
+CHECK: Number: 2
+CHECK: Name: .data (2E 64 61 74 61 00 00 00)
+CHECK: Characteristics [ (0xC0000040)
+CHECK: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
+CHECK: IMAGE_SCN_MEM_READ (0x40000000)
+CHECK: IMAGE_SCN_MEM_WRITE (0x80000000)
+CHECK: ]
+CHECK: }
+CHECK: Section {
+CHECK: Number: 3
+CHECK: Name: .foo (2E 66 6F 6F 00 00 00 00)
+CHECK: Characteristics [ (0xC2000040)
+CHECK: IMAGE_SCN_CNT_INITIALIZED_DATA (0x40)
+CHECK: IMAGE_SCN_MEM_DISCARDABLE (0x2000000)
+CHECK: IMAGE_SCN_MEM_READ (0x40000000)
+CHECK: IMAGE_SCN_MEM_WRITE (0x80000000)
+CHECK: ]
+CHECK: }
+CHECK: Section {
+CHECK: Number: 4
+CHECK: Name: .text (2E 74 65 78 74 00 00 00)
+CHECK: Characteristics [ (0xE0000020)
+CHECK: IMAGE_SCN_CNT_CODE (0x20)
+CHECK: IMAGE_SCN_MEM_EXECUTE (0x20000000)
+CHECK: IMAGE_SCN_MEM_READ (0x40000000)
+CHECK: IMAGE_SCN_MEM_WRITE (0x80000000)
+CHECK: ]
+CHECK: }
+CHECK: ]
More information about the llvm-commits
mailing list