Skip to content

Commit fc05695

Browse files
committedAug 27, 2019
Handle local commons for XCOFF object file writing
Summary: Adds support for emitting common local global symbols to an XCOFF object file. Local commons are emitted into the .bss section with a storage class of C_HIDEXT. Patch by: daltenty Reviewers: sfertile, hubert.reinterpretcast Differential Revision: https://reviews.llvm.org/D66097 llvm-svn: 370070
1 parent 7f536bc commit fc05695

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed
 

‎llvm/lib/MC/MCXCOFFStreamer.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,12 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#include "llvm/MC/MCXCOFFStreamer.h"
13+
#include "llvm/BinaryFormat/XCOFF.h"
1414
#include "llvm/MC/MCAsmBackend.h"
1515
#include "llvm/MC/MCCodeEmitter.h"
1616
#include "llvm/MC/MCObjectWriter.h"
1717
#include "llvm/MC/MCSymbolXCOFF.h"
18+
#include "llvm/MC/MCXCOFFStreamer.h"
1819
#include "llvm/Support/TargetRegistry.h"
1920

2021
using namespace llvm;
@@ -72,7 +73,8 @@ MCStreamer *llvm::createXCOFFStreamer(MCContext &Context,
7273
return S;
7374
}
7475

75-
void MCXCOFFStreamer::EmitXCOFFLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
76-
unsigned ByteAlign) {
77-
report_fatal_error("Emission of local commons not implemented yet.");
76+
void MCXCOFFStreamer::EmitXCOFFLocalCommonSymbol(MCSymbol *Symbol,
77+
uint64_t Size,
78+
unsigned ByteAlignment) {
79+
EmitCommonSymbol(Symbol, Size, ByteAlignment);
7880
}

‎llvm/lib/MC/XCOFFObjectWriter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,13 @@ void XCOFFObjectWriter::executePostLayoutBinding(
235235
break;
236236
}
237237
report_fatal_error("Unhandled mapping of read-write csect to section.");
238+
case XCOFF::XMC_BS:
239+
assert(XCOFF::XTY_CM == MCSec->getCSectType() &&
240+
"Mapping invalid csect. CSECT with bss storage class must be "
241+
"common type.");
242+
BSSCsects.emplace_back(MCSec);
243+
WrapperMap[MCSec] = &BSSCsects.back();
244+
break;
238245
default:
239246
report_fatal_error("Unhandled mapping of csect to section.");
240247
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,47 @@
11
; RUN: llc -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s
22
; RUN: llc -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s
33

4+
; RUN: llc -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s
5+
; RUN: llvm-readobj --section-headers --file-header %t.o | \
6+
; RUN: FileCheck --check-prefix=OBJ %s
7+
8+
; RUN: not llc -mtriple powerpc64-ibm-aix-xcoff -filetype=obj < %s 2>&1 | \
9+
; RUN: FileCheck --check-prefix=OBJ64 %s
10+
; OBJ64: LLVM ERROR: 64-bit XCOFF object files are not supported yet.
11+
412
@a = internal global i32 0, align 4
513
@b = internal global i64 0, align 8
614
@c = internal global i16 0, align 2
715

816
; CHECK: .lcomm a,4,a,2
917
; CHECK-NEXT: .lcomm b,8,b,3
1018
; CHECK-NEXT: .lcomm c,2,c,1
19+
20+
; OBJ: File: {{.*}}aix-xcoff-lcomm.ll.tmp.o
21+
; OBJ-NEXT: Format: aixcoff-rs6000
22+
; OBJ-NEXT: Arch: powerpc
23+
; OBJ-NEXT: AddressSize: 32bit
24+
; OBJ-NEXT: FileHeader {
25+
; OBJ-NEXT: Magic: 0x1DF
26+
; OBJ-NEXT: NumberOfSections: 1
27+
; OBJ-NEXT: TimeStamp:
28+
; OBJ-NEXT: SymbolTableOffset: 0x3C
29+
; OBJ-NEXT: SymbolTableEntries: 6
30+
; OBJ-NEXT: OptionalHeaderSize: 0x0
31+
; OBJ-NEXT: Flags: 0x0
32+
; OBJ-NEXT: }
33+
; OBJ-NEXT: Sections [
34+
; OBJ-NEXT: Section {
35+
; OBJ-NEXT: Index: 1
36+
; OBJ-NEXT: Name: .bss
37+
; OBJ-NEXT: PhysicalAddress: 0x0
38+
; OBJ-NEXT: VirtualAddress: 0x0
39+
; OBJ-NEXT: Size: 0x14
40+
; OBJ-NEXT: RawDataOffset: 0x0
41+
; OBJ-NEXT: RelocationPointer: 0x0
42+
; OBJ-NEXT: LineNumberPointer: 0x0
43+
; OBJ-NEXT: NumberOfRelocations: 0
44+
; OBJ-NEXT: NumberOfLineNumbers: 0
45+
; OBJ-NEXT: Type: STYP_BSS (0x80)
46+
; OBJ-NEXT: }
47+
; OBJ-NEXT: ]

0 commit comments

Comments
 (0)