summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2010-10-09 15:44:27 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2010-10-09 15:44:27 +0000
commit86bbd71088937b238485afd22a13d032fd47b7c6 (patch)
tree12dba32fc1683271707eae25e038a2f6dc460846 /llvm/lib
parentc8dbdfd4ba366a95d8325a8dce6cbd8cbf4e63c3 (diff)
downloadbcm5719-llvm-86bbd71088937b238485afd22a13d032fd47b7c6.tar.gz
bcm5719-llvm-86bbd71088937b238485afd22a13d032fd47b7c6.zip
MC-COFF: Implement InitSections. Fixes PR8335.
llvm-svn: 116151
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/MC/WinCOFFStreamer.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/llvm/lib/MC/WinCOFFStreamer.cpp b/llvm/lib/MC/WinCOFFStreamer.cpp
index 0ff68df9dd7..9fd80a4f63c 100644
--- a/llvm/lib/MC/WinCOFFStreamer.cpp
+++ b/llvm/lib/MC/WinCOFFStreamer.cpp
@@ -79,6 +79,41 @@ public:
virtual void EmitDwarfFileDirective(unsigned FileNo,StringRef Filename);
virtual void EmitInstruction(const MCInst &Instruction);
virtual void Finish();
+
+private:
+ void SetSection(StringRef Section,
+ unsigned Characteristics,
+ SectionKind Kind) {
+ SwitchSection(getContext().getCOFFSection(Section, Characteristics, Kind));
+ }
+
+ void SetSectionText() {
+ SetSection(".text",
+ COFF::IMAGE_SCN_CNT_CODE
+ | COFF::IMAGE_SCN_MEM_EXECUTE
+ | COFF::IMAGE_SCN_MEM_READ,
+ SectionKind::getText());
+ EmitCodeAlignment(4, 0);
+ }
+
+ void SetSectionData() {
+ SetSection(".data",
+ COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
+ | COFF::IMAGE_SCN_MEM_READ
+ | COFF::IMAGE_SCN_MEM_WRITE,
+ SectionKind::getDataRel());
+ EmitCodeAlignment(4, 0);
+ }
+
+ void SetSectionBSS() {
+ SetSection(".bss",
+ COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA
+ | COFF::IMAGE_SCN_MEM_READ
+ | COFF::IMAGE_SCN_MEM_WRITE,
+ SectionKind::getBSS());
+ EmitCodeAlignment(4, 0);
+ }
+
};
} // end anonymous namespace.
@@ -128,6 +163,10 @@ void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size,
// MCStreamer interface
void WinCOFFStreamer::InitSections() {
+ SetSectionText();
+ SetSectionData();
+ SetSectionBSS();
+ SetSectionText();
}
void WinCOFFStreamer::EmitLabel(MCSymbol *Symbol) {
OpenPOWER on IntegriCloud