[PowerPC][XCOFF] Add support for zero initialized global values.
authorSean Fertile <sd.fertile@gmail.com>
Mon, 28 Oct 2019 20:07:10 +0000 (16:07 -0400)
committerSean Fertile <sd.fertile@gmail.com>
Mon, 11 Nov 2019 23:52:10 +0000 (18:52 -0500)
For XCOFF, globals mapped into the .bss section are linked as COMMON
definitions. This behaviour is incorrect for zero initialized data, so
emit those to the .data section instead.

Differential Revision: https://reviews.llvm.org/D69528

llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll

index 4978f4b..f941b98 100644 (file)
@@ -1855,6 +1855,12 @@ MCSection *TargetLoweringObjectFileXCOFF::SelectSectionForGlobal(
   if (Kind.isData())
     return DataSection;
 
+  // Zero initialized data must be emitted to the .data section because external
+  // linkage control sections that get mapped to the .bss section will be linked
+  // as tentative defintions, which is only appropriate for SectionKind::Common.
+  if (Kind.isBSS())
+    return DataSection;
+
   report_fatal_error("XCOFF other section types not yet implemented.");
 }
 
index 49365bc..63dad68 100644 (file)
@@ -1747,7 +1747,7 @@ void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
     report_fatal_error("COMDAT not yet supported by AIX.");
 
   SectionKind GVKind = getObjFileLowering().getKindForGlobal(GV, TM);
-  if (!GVKind.isCommon() && !GVKind.isBSSLocal() && !GVKind.isData())
+  if (!GVKind.isCommon() && !GVKind.isBSS() && !GVKind.isData())
     report_fatal_error("Encountered a global variable kind that is "
                        "not supported yet.");
 
index 5c8ac05..c6a31ae 100644 (file)
@@ -21,6 +21,9 @@
 @over_aligned = local_unnamed_addr global double 9.000000e+02, align 32
 @chrarray = local_unnamed_addr global [4 x i8] c"abcd", align 1
 @dblarr = local_unnamed_addr global [4 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00], align 8
+@d_0 = global double 0.000000e+00, align 8
+@s_0 = global i16 0, align 2
+@f_0 = global float 0.000000e+00, align 4
 
 @a = common global i32 0, align 4
 @b = common global i64 0, align 8
 ; CHECK-NEXT: .llong  4613937818241073152
 ; CHECK-NEXT: .llong  4616189618054758400
 
+; CHECK:      .globl  d_0
+; CHECK-NEXT: .align 3
+; CHECK-NEXT: d_0:
+; CHECK-NEXT: .llong 0
+
+; CHECK:      .globl  s_0
+; CHECK-NEXT: .align  1
+; CHECK-NEXT: s_0:
+; CHECK-NEXT: .short 0
+
+; CHECK:      .globl f_0
+; CHECK-NEXT: .align 2
+; CHECK-NEXT: f_0:
+; CHECK-NEXT: .long 0
+
 ; CHECK-NEXT: .comm   a[RW],4,2
 ; CHECK-NEXT: .comm   b[RW],8,3
 ; CHECK-NEXT: .comm   c[RW],2,1
 ; OBJ-NEXT:   Magic: 0x1DF
 ; OBJ-NEXT:   NumberOfSections: 3
 ; OBJ-NEXT:   TimeStamp:
-; OBJ-NEXT:   SymbolTableOffset: 0xDC
-; OBJ-NEXT:   SymbolTableEntries: 34
+; OBJ-NEXT:   SymbolTableOffset: 0xEC
+; OBJ-NEXT:   SymbolTableEntries: 40
 ; OBJ-NEXT:   OptionalHeaderSize: 0x0
 ; OBJ-NEXT:   Flags: 0x0
 ; OBJ-NEXT: }
 ; OBJ-NEXT:     Name: .data
 ; OBJ-NEXT:     PhysicalAddress: 0x0
 ; OBJ-NEXT:     VirtualAddress: 0x0
-; OBJ-NEXT:     Size: 0x50
+; OBJ-NEXT:     Size: 0x60
 ; OBJ-NEXT:     RawDataOffset: 0x8C
 ; OBJ-NEXT:     RelocationPointer: 0x0
 ; OBJ-NEXT:     LineNumberPointer: 0x0
 ; OBJ:        Section {
 ; OBJ-NEXT:     Index: 3
 ; OBJ-NEXT:     Name: .bss
-; OBJ-NEXT:     PhysicalAddress: 0x50
-; OBJ-NEXT:     VirtualAddress: 0x50
-; OBJ-NEXT:     Size: 0x5C
+; OBJ-NEXT:     PhysicalAddress: 0x60
+; OBJ-NEXT:     VirtualAddress: 0x60
+; OBJ-NEXT:     Size: 0x6C
 ; OBJ-NEXT:     RawDataOffset: 0x0
 ; OBJ-NEXT:     RelocationPointer: 0x0
 ; OBJ-NEXT:     LineNumberPointer: 0x0
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
 ; SYMS-NEXT:       Index: [[#INDX+3]]
-; SYMS-NEXT:       SectionLen: 80
+; SYMS-NEXT:       SectionLen: 96
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0
 ; SYMS-NEXT:       SymbolAlignmentLog2: 5
 
 ; SYMS:        Symbol {
 ; SYMS-NEXT:     Index: [[#INDX+20]]
-; SYMS-NEXT:     Name: a
+; SYMS-NEXT:     Name: d_0
 ; SYMS-NEXT:     Value (RelocatableAddress): 0x50
-; SYMS-NEXT:     Section: .bss
+; SYMS-NEXT:     Section: .data
 ; SYMS-NEXT:     Type: 0x0
 ; SYMS-NEXT:     StorageClass: C_EXT (0x2)
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
 ; SYMS-NEXT:       Index: [[#INDX+21]]
+; SYMS-NEXT:       ContainingCsectSymbolIndex: [[#INDX+2]]
+; SYMS-NEXT:       ParameterHashIndex: 0x0
+; SYMS-NEXT:       TypeChkSectNum: 0x0
+; SYMS-NEXT:       SymbolAlignmentLog2: 0
+; SYMS-NEXT:       SymbolType: XTY_LD (0x2)
+; SYMS-NEXT:       StorageMappingClass: XMC_RW (0x5)
+; SYMS-NEXT:       StabInfoIndex: 0x0
+; SYMS-NEXT:       StabSectNum: 0x0
+; SYMS-NEXT:     }
+; SYMS-NEXT:   }
+
+; SYMS:        Symbol {
+; SYMS-NEXT:     Index: [[#INDX+22]]
+; SYMS-NEXT:     Name: s_0
+; SYMS-NEXT:     Value (RelocatableAddress): 0x58
+; SYMS-NEXT:     Section: .data
+; SYMS-NEXT:     Type: 0x0
+; SYMS-NEXT:     StorageClass: C_EXT (0x2)
+; SYMS-NEXT:     NumberOfAuxEntries: 1
+; SYMS-NEXT:     CSECT Auxiliary Entry {
+; SYMS-NEXT:       Index: [[#INDX+23]]
+; SYMS-NEXT:       ContainingCsectSymbolIndex: [[#INDX+2]]
+; SYMS-NEXT:       ParameterHashIndex: 0x0
+; SYMS-NEXT:       TypeChkSectNum: 0x0
+; SYMS-NEXT:       SymbolAlignmentLog2: 0
+; SYMS-NEXT:       SymbolType: XTY_LD (0x2)
+; SYMS-NEXT:       StorageMappingClass: XMC_RW (0x5)
+; SYMS-NEXT:       StabInfoIndex: 0x0
+; SYMS-NEXT:       StabSectNum: 0x0
+; SYMS-NEXT:     }
+; SYMS-NEXT:   }
+
+; SYMS:        Symbol {
+; SYMS-NEXT:     Index: [[#INDX+24]]
+; SYMS-NEXT:     Name: f_0
+; SYMS-NEXT:     Value (RelocatableAddress): 0x5C
+; SYMS-NEXT:     Section: .data
+; SYMS-NEXT:     Type: 0x0
+; SYMS-NEXT:     StorageClass: C_EXT (0x2)
+; SYMS-NEXT:     NumberOfAuxEntries: 1
+; SYMS-NEXT:     CSECT Auxiliary Entry {
+; SYMS-NEXT:       Index: [[#INDX+25]]
+; SYMS-NEXT:       ContainingCsectSymbolIndex: [[#INDX+2]]
+; SYMS-NEXT:       ParameterHashIndex: 0x0
+; SYMS-NEXT:       TypeChkSectNum: 0x0
+; SYMS-NEXT:       SymbolAlignmentLog2: 0
+; SYMS-NEXT:       SymbolType: XTY_LD (0x2)
+; SYMS-NEXT:       StorageMappingClass: XMC_RW (0x5)
+; SYMS-NEXT:       StabInfoIndex: 0x0
+; SYMS-NEXT:       StabSectNum: 0x0
+; SYMS-NEXT:     }
+; SYMS-NEXT:   }
+
+; SYMS:        Symbol {
+; SYMS-NEXT:     Index: [[#INDX+26]]
+; SYMS-NEXT:     Name: a
+; SYMS-NEXT:     Value (RelocatableAddress): 0x60
+; SYMS-NEXT:     Section: .bss
+; SYMS-NEXT:     Type: 0x0
+; SYMS-NEXT:     StorageClass: C_EXT (0x2)
+; SYMS-NEXT:     NumberOfAuxEntries: 1
+; SYMS-NEXT:     CSECT Auxiliary Entry {
+; SYMS-NEXT:       Index: [[#INDX+27]]
 ; SYMS-NEXT:       SectionLen: 4
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0
 ; SYMS-NEXT:   }
 
 ; SYMS:        Symbol {
-; SYMS-NEXT:     Index: [[#INDX+22]]
+; SYMS-NEXT:     Index: [[#INDX+28]]
 ; SYMS-NEXT:     Name: b
-; SYMS-NEXT:     Value (RelocatableAddress): 0x58
+; SYMS-NEXT:     Value (RelocatableAddress): 0x68
 ; SYMS-NEXT:     Section: .bss
 ; SYMS-NEXT:     Type: 0x0
 ; SYMS-NEXT:     StorageClass: C_EXT (0x2)
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
-; SYMS-NEXT:       Index: [[#INDX+23]]
+; SYMS-NEXT:       Index: [[#INDX+29]]
 ; SYMS-NEXT:       SectionLen: 8
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0
 ; SYMS-NEXT:   }
 
 ; SYMS:        Symbol {
-; SYMS-NEXT:     Index: [[#INDX+24]]
+; SYMS-NEXT:     Index: [[#INDX+30]]
 ; SYMS-NEXT:     Name: c
-; SYMS-NEXT:     Value (RelocatableAddress): 0x60
+; SYMS-NEXT:     Value (RelocatableAddress): 0x70
 ; SYMS-NEXT:     Section: .bss
 ; SYMS-NEXT:     Type: 0x0
 ; SYMS-NEXT:     StorageClass: C_EXT (0x2)
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
-; SYMS-NEXT:       Index: [[#INDX+25]]
+; SYMS-NEXT:       Index: [[#INDX+31]]
 ; SYMS-NEXT:       SectionLen: 2
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0
 ; SYMS-NEXT:   }
 
 ; SYMS:        Symbol {
-; SYMS-NEXT:     Index: [[#INDX+26]]
+; SYMS-NEXT:     Index: [[#INDX+32]]
 ; SYMS-NEXT:     Name: d
-; SYMS-NEXT:     Value (RelocatableAddress): 0x68
+; SYMS-NEXT:     Value (RelocatableAddress): 0x78
 ; SYMS-NEXT:     Section: .bss
 ; SYMS-NEXT:     Type: 0x0
 ; SYMS-NEXT:     StorageClass: C_EXT (0x2)
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
-; SYMS-NEXT:       Index: [[#INDX+27]]
+; SYMS-NEXT:       Index: [[#INDX+33]]
 ; SYMS-NEXT:       SectionLen: 8
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0
 ; SYMS-NEXT:   }
 
 ; SYMS:        Symbol {
-; SYMS-NEXT:     Index: [[#INDX+28]]
+; SYMS-NEXT:     Index: [[#INDX+34]]
 ; SYMS-NEXT:     Name: f
-; SYMS-NEXT:     Value (RelocatableAddress): 0x70
+; SYMS-NEXT:     Value (RelocatableAddress): 0x80
 ; SYMS-NEXT:     Section: .bss
 ; SYMS-NEXT:     Type: 0x0
 ; SYMS-NEXT:     StorageClass: C_EXT (0x2)
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
-; SYMS-NEXT:       Index: [[#INDX+29]]
+; SYMS-NEXT:       Index: [[#INDX+35]]
 ; SYMS-NEXT:       SectionLen: 4
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0
 ; SYMS-NEXT:   }
 
 ; SYMS:        Symbol {
-; SYMS-NEXT:     Index: [[#INDX+30]]
+; SYMS-NEXT:     Index: [[#INDX+36]]
 ; SYMS-NEXT:     Name: over_aligned_comm
-; SYMS-NEXT:     Value (RelocatableAddress): 0x80
+; SYMS-NEXT:     Value (RelocatableAddress): 0xA0
 ; SYMS-NEXT:     Section: .bss
 ; SYMS-NEXT:     Type: 0x0
 ; SYMS-NEXT:     StorageClass: C_EXT (0x2)
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
-; SYMS-NEXT:       Index: [[#INDX+31]]
+; SYMS-NEXT:       Index: [[#INDX+37]]
 ; SYMS-NEXT:       SectionLen: 8
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0
 ; SYMS-NEXT:   }
 
 ; SYMS:        Symbol {
-; SYMS-NEXT:     Index: [[#INDX+32]]
+; SYMS-NEXT:     Index: [[#INDX+38]]
 ; SYMS-NEXT:     Name: array
-; SYMS-NEXT:     Value (RelocatableAddress): 0x88
+; SYMS-NEXT:     Value (RelocatableAddress): 0xA8
 ; SYMS-NEXT:     Section: .bss
 ; SYMS-NEXT:     Type: 0x0
 ; SYMS-NEXT:     StorageClass: C_EXT (0x2)
 ; SYMS-NEXT:     NumberOfAuxEntries: 1
 ; SYMS-NEXT:     CSECT Auxiliary Entry {
-; SYMS-NEXT:       Index: [[#INDX+33]]
+; SYMS-NEXT:       Index: [[#INDX+39]]
 ; SYMS-NEXT:       SectionLen: 33
 ; SYMS-NEXT:       ParameterHashIndex: 0x0
 ; SYMS-NEXT:       TypeChkSectNum: 0x0