OSDN Git Service

stop using the .lcomm pseudoop on darwin, instead, directly use the
authorChris Lattner <sabre@nondot.org>
Tue, 19 Jan 2010 06:25:51 +0000 (06:25 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 19 Jan 2010 06:25:51 +0000 (06:25 +0000)
.zerofill directive.  Streamerize its generation.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93868 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAsmInfo.h
include/llvm/Target/TargetLoweringObjectFile.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/MC/MCAsmInfo.cpp
lib/MC/MCAsmInfoDarwin.cpp
lib/Target/TargetLoweringObjectFile.cpp

index 22f1475..82a4787 100644 (file)
@@ -192,7 +192,7 @@ namespace llvm {
     /// LCOMMDirective - This is the name of a directive (if supported) that can
     /// be used to efficiently declare a local (internal) block of zero
     /// initialized data in the .bss/.data section.  The syntax expected is:
-    /// @verbatim <LCOMMDirective> SYMBOLNAME LENGTHINBYTES, ALIGNMENT
+    /// @verbatim <LCOMMDirective> SYMBOLNAME LENGTHINBYTES
     /// @endverbatim
     const char *LCOMMDirective;              // Defaults to null.
     
@@ -202,10 +202,6 @@ namespace llvm {
     /// argument that specifies the alignment of the declaration.
     bool COMMDirectiveTakesAlignment;        // Defaults to true.
     
-    /// LCOMMDirectiveTakesAlignment - True if LCOMMDirective takes a third
-    /// argument that specifies the alignment of the declaration.
-    bool LCOMMDirectiveTakesAlignment;       // Defaults to false.
-    
     /// HasDotTypeDotSizeDirective - True if the target has .type and .size
     /// directives, this is true for most ELF targets.
     bool HasDotTypeDotSizeDirective;         // Defaults to true.
@@ -418,9 +414,6 @@ namespace llvm {
     bool getCOMMDirectiveTakesAlignment() const {
       return COMMDirectiveTakesAlignment;
     }
-    bool getLCOMMDirectiveTakesAlignment() const {
-      return LCOMMDirectiveTakesAlignment;
-    }
     bool hasDotTypeDotSizeDirective() const {
       return HasDotTypeDotSizeDirective;
     }
index 304518a..d3e5cf2 100644 (file)
@@ -259,6 +259,7 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
   const MCSection *ConstDataSection;
   const MCSection *DataCoalSection;
   const MCSection *DataCommonSection;
+  const MCSection *DataBSSSection;
   const MCSection *FourByteConstantSection;
   const MCSection *EightByteConstantSection;
   const MCSection *SixteenByteConstantSection;
index 411a0f0..fbbcc27 100644 (file)
@@ -171,21 +171,34 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
       WriteAsOperand(O, GV, /*PrintType=*/false, GV->getParent());
       O << '\n';
     }
+    
+    // Handle common symbols.
     if (GVKind.isCommon()) {
       // .comm _foo, 42, 4
       OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
-    } else if (const char *LComm = MAI->getLCOMMDirective()) {
-      // .lcomm _foo, 42, 4
+      return;
+    }
+    
+    // Handle local BSS symbols.
+    if (MAI->hasMachoZeroFillDirective()) {
+      const MCSection *TheSection =
+        getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM);
+      // .zerofill __DATA, __bss, _foo, 400, 5
+      OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog);
+      return;
+    }
+    
+    if (const char *LComm = MAI->getLCOMMDirective()) {
+      // .lcomm _foo, 42
       O << LComm << *GVSym << ',' << Size;
-      if (MAI->getLCOMMDirectiveTakesAlignment())
-        O << ',' << AlignLog;
       O << '\n';
-    } else {
-      // .local _foo
-      O << "\t.local\t" << *GVSym << '\n';
-      // .comm _foo, 42, 4
-      OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
+      return;
     }
+    
+    // .local _foo
+    O << "\t.local\t" << *GVSym << '\n';
+    // .comm _foo, 42, 4
+    OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
     return;
   }
   
index 556b0aa..731ccf9 100644 (file)
@@ -56,7 +56,6 @@ MCAsmInfo::MCAsmInfo() {
   LCOMMDirective = 0;
   COMMDirective = "\t.comm\t";
   COMMDirectiveTakesAlignment = true;
-  LCOMMDirectiveTakesAlignment = false;
   HasDotTypeDotSizeDirective = true;
   HasSingleParameterDotFile = true;
   UsedDirective = 0;
index a1f6051..664a55c 100644 (file)
@@ -33,15 +33,15 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {
   WeakDefDirective = "\t.weak_definition ";
   WeakRefDirective = "\t.weak_reference ";
   HiddenDirective = "\t.private_extern ";
-  LCOMMDirective = "\t.lcomm\t";
   ZeroDirective = "\t.space\t";  // ".space N" emits N zeros.
   HasMachoZeroFillDirective = true;  // Uses .zerofill
   HasStaticCtorDtorReferenceInStaticMode = true;
-  LCOMMDirectiveTakesAlignment = true;
   SetDirective = "\t.set";
   ProtectedDirective = "\t.globl\t";
   HasDotTypeDotSizeDirective = false;
   UsedDirective = "\t.no_dead_strip\t";
+  // Note: Even though darwin has the .lcomm directive, it is just a synonym for
+  // zerofill, so we prefer to use .zerofill.
 
   // _foo.eh symbols are currently always exported so that the linker knows
   // about them.  This is not necessary on 10.6 and later, but it
index 77203e0..01fb217 100644 (file)
@@ -761,16 +761,19 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
   ConstDataCoalSection
     = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED,
                       SectionKind::getText());
-  DataCommonSection
-    = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL,
-                      SectionKind::getBSS());
   ConstDataSection  // .const_data
     = getMachOSection("__DATA", "__const", 0,
                       SectionKind::getReadOnlyWithRel());
   DataCoalSection
     = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
                       SectionKind::getDataRel());
-
+  DataCommonSection
+    = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL,
+                      SectionKind::getBSS());
+  DataBSSSection
+    = getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
+                    SectionKind::getBSS());
+  
 
   LazySymbolPointerSection
     = getMachOSection("__DATA", "__la_symbol_ptr",
@@ -933,6 +936,11 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
   // DATA, __common section with the .zerofill directive.
   if (Kind.isBSSExtern())
     return DataCommonSection;
+
+  // Put zero initialized globals with local linkage in __DATA,__bss directive
+  // with the .zerofill directive (aka .lcomm).
+  if (Kind.isBSSLocal())
+    return DataBSSSection;
   
   // Otherwise, just drop the variable in the normal data section.
   return DataSection;