diff options
| author | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-10-09 15:44:27 +0000 |
|---|---|---|
| committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2010-10-09 15:44:27 +0000 |
| commit | 86bbd71088937b238485afd22a13d032fd47b7c6 (patch) | |
| tree | 12dba32fc1683271707eae25e038a2f6dc460846 | |
| parent | c8dbdfd4ba366a95d8325a8dce6cbd8cbf4e63c3 (diff) | |
| download | bcm5719-llvm-86bbd71088937b238485afd22a13d032fd47b7c6.tar.gz bcm5719-llvm-86bbd71088937b238485afd22a13d032fd47b7c6.zip | |
MC-COFF: Implement InitSections. Fixes PR8335.
llvm-svn: 116151
| -rw-r--r-- | llvm/lib/MC/WinCOFFStreamer.cpp | 39 | ||||
| -rw-r--r-- | llvm/test/MC/COFF/basic-coff.s | 6 | ||||
| -rw-r--r-- | llvm/test/MC/COFF/module-asm.ll | 26 |
3 files changed, 68 insertions, 3 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) { diff --git a/llvm/test/MC/COFF/basic-coff.s b/llvm/test/MC/COFF/basic-coff.s index a94273bfc8d..fcbe2904a54 100644 --- a/llvm/test/MC/COFF/basic-coff.s +++ b/llvm/test/MC/COFF/basic-coff.s @@ -74,9 +74,9 @@ L_.str: # @.str // CHECK: PointerToLineNumbers = 0x0
// CHECK: NumberOfRelocations = 0
// CHECK: NumberOfLineNumbers = 0
-// CHECK: Charateristics = 0xC0100040
+// CHECK: Charateristics = 0xC0300040
// CHECK: IMAGE_SCN_CNT_INITIALIZED_DATA
-// CHECK: IMAGE_SCN_ALIGN_1BYTES
+// CHECK: IMAGE_SCN_ALIGN_4BYTES
// CHECK: IMAGE_SCN_MEM_READ
// CHECK: IMAGE_SCN_MEM_WRITE
// CHECK: SectionData =
@@ -94,7 +94,7 @@ L_.str: # @.str // CHECK: StorageClass = IMAGE_SYM_CLASS_STATIC (3)
// CHECK: NumberOfAuxSymbols = 1
// CHECK: AuxillaryData =
-// CHECK: 15 00 00 00 02 00 00 00 - 00 00 00 00 01 00 00 00 |................|
+// CHECK: 18 00 00 00 02 00 00 00 - 00 00 00 00 01 00 00 00 |................|
// CHECK: 00 00 |..|
// CHECK: }
// CHECK: 2 = {
diff --git a/llvm/test/MC/COFF/module-asm.ll b/llvm/test/MC/COFF/module-asm.ll new file mode 100644 index 00000000000..9c6d00d2f50 --- /dev/null +++ b/llvm/test/MC/COFF/module-asm.ll @@ -0,0 +1,26 @@ +; The purpose of this test is to verify that various module level assembly +; constructs work. + +; RUN: llc -filetype=obj -mtriple i686-pc-win32 %s -o - | coff-dump.py | FileCheck %s +; RUN: llc -filetype=obj -mtriple x86_64-pc-win32 %s -o - | coff-dump.py | FileCheck %s + +module asm ".text" +module asm "_foo:" +module asm " ret" + +; CHECK: Name = .text +; CHECK-NEXT: VirtualSize = 0 +; CHECK-NEXT: VirtualAddress = 0 +; CHECK-NEXT: SizeOfRawData = {{[0-9]+}} +; CHECK-NEXT: PointerToRawData = 0x{{[0-9A-F]+}} +; CHECK-NEXT: PointerToRelocations = 0x{{[0-9A-F]+}} +; CHECK-NEXT: PointerToLineNumbers = 0x0 +; CHECK-NEXT: NumberOfRelocations = 0 +; CHECK-NEXT: NumberOfLineNumbers = 0 +; CHECK-NEXT: Charateristics = 0x60300020 +; CHECK-NEXT: IMAGE_SCN_CNT_CODE +; CHECK-NEXT: IMAGE_SCN_ALIGN_4BYTES +; CHECK-NEXT: IMAGE_SCN_MEM_EXECUTE +; CHECK-NEXT: IMAGE_SCN_MEM_READ +; CHECK-NEXT: SectionData = +; CHECK-NEXT: C3 |

