diff options
| -rw-r--r-- | llvm/include/llvm/MC/MCAsmInfo.h | 19 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 31 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfException.h | 4 | ||||
| -rw-r--r-- | llvm/lib/MC/MCAsmInfo.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/MC/MCAsmInfoDarwin.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/MC/MCMachOStreamer.cpp | 1 | 
7 files changed, 35 insertions, 36 deletions
diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h index 0be27530f27..bebae825e48 100644 --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -209,10 +209,9 @@ namespace llvm {      /// .file directive, this is true for ELF targets.      bool HasSingleParameterDotFile;          // Defaults to true. -    /// UsedDirective - This directive, if non-null, is used to declare a global -    /// as being used somehow that the assembler can't see.  This prevents dead -    /// code elimination on some targets. -    const char *UsedDirective;               // Defaults to NULL. +    /// HasNoDeadStrip - True if this target supports the MachO .no_dead_strip +    /// directive. +    bool HasNoDeadStrip;                     // Defaults to false.      /// WeakRefDirective - This directive, if non-null, is used to declare a      /// global as being a weak undefined symbol. @@ -410,15 +409,9 @@ namespace llvm {      bool getCOMMDirectiveTakesAlignment() const {        return COMMDirectiveTakesAlignment;      } -    bool hasDotTypeDotSizeDirective() const { -      return HasDotTypeDotSizeDirective; -    } -    bool hasSingleParameterDotFile() const { -      return HasSingleParameterDotFile; -    } -    const char *getUsedDirective() const { -      return UsedDirective; -    } +    bool hasDotTypeDotSizeDirective() const {return HasDotTypeDotSizeDirective;} +    bool hasSingleParameterDotFile() const { return HasSingleParameterDotFile; } +    bool hasNoDeadStrip() const { return HasNoDeadStrip; }      const char *getWeakRefDirective() const { return WeakRefDirective; }      const char *getWeakDefDirective() const { return WeakDefDirective; }      const char *getLinkOnceDirective() const { return LinkOnceDirective; } diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 3d2f4157413..415627eb9a4 100644 --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -313,7 +313,7 @@ bool AsmPrinter::doFinalization(Module &M) {    }    if (MAI->getSetDirective()) { -    O << '\n'; +    OutStreamer.AddBlankLine();      for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();           I != E; ++I) {        MCSymbol *Name = GetGlobalValueSymbol(I); @@ -563,7 +563,7 @@ void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,    } else {      O << *GetMBBSymbol(MBB->getNumber());      // If the arch uses custom Jump Table directives, don't calc relative to -    // JT +    // JT.      if (!HadJTEntryDirective)         O << '-' << *GetJTISymbol(uid);    } @@ -575,7 +575,7 @@ void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI,  /// do nothing and return false.  bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {    if (GV->getName() == "llvm.used") { -    if (MAI->getUsedDirective() != 0)    // No need to emit this at all. +    if (MAI->hasNoDeadStrip())    // No need to emit this at all.        EmitLLVMUsedList(GV->getInitializer());      return true;    } @@ -597,8 +597,11 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {      EmitXXStructorList(GV->getInitializer());      if (TM.getRelocationModel() == Reloc::Static && -        MAI->hasStaticCtorDtorReferenceInStaticMode()) -      O << ".reference .constructors_used\n"; +        MAI->hasStaticCtorDtorReferenceInStaticMode()) { +      StringRef Sym(".constructors_used"); +      OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym), +                                      MCStreamer::Reference); +    }      return true;    }  @@ -608,8 +611,11 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {      EmitXXStructorList(GV->getInitializer());      if (TM.getRelocationModel() == Reloc::Static && -        MAI->hasStaticCtorDtorReferenceInStaticMode()) -      O << ".reference .destructors_used\n"; +        MAI->hasStaticCtorDtorReferenceInStaticMode()) { +      StringRef Sym(".destructors_used"); +      OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym), +                                      MCStreamer::Reference); +    }      return true;    } @@ -620,8 +626,6 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {  /// global in the specified llvm.used list for which emitUsedDirectiveFor  /// is true, as being used with this directive.  void AsmPrinter::EmitLLVMUsedList(Constant *List) { -  const char *Directive = MAI->getUsedDirective(); -    // Should be an array of 'i8*'.    ConstantArray *InitList = dyn_cast<ConstantArray>(List);    if (InitList == 0) return; @@ -629,11 +633,9 @@ void AsmPrinter::EmitLLVMUsedList(Constant *List) {    for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {      const GlobalValue *GV =        dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts()); -    if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang)) { -      O << Directive; -      EmitConstantValueOnly(InitList->getOperand(i)); -      O << '\n'; -    } +    if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang)) +      OutStreamer.EmitSymbolAttribute(GetGlobalValueSymbol(GV), +                                      MCStreamer::NoDeadStrip);    }  } @@ -1584,6 +1586,7 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const {    // Print the main label for the block.    if (MBB->pred_empty() || MBB->isOnlyReachableByFallthrough()) {      if (VerboseAsm) { +      // NOTE: Want this comment at start of line.        O << MAI->getCommentString() << " BB#" << MBB->getNumber() << ':';        if (const BasicBlock *BB = MBB->getBasicBlock())          if (BB->hasName()) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp index 9a1c41c2a62..1b72f73fb1d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfException.cpp @@ -245,8 +245,9 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {      // This name has no connection to the function, so it might get      // dead-stripped when the function is not, erroneously.  Prohibit      // dead-stripping unconditionally. -    if (const char *UsedDirective = MAI->getUsedDirective()) -      O << UsedDirective << *EHFrameInfo.FunctionEHSym << "\n\n"; +    if (MAI->hasNoDeadStrip()) +      Asm->OutStreamer.EmitSymbolAttribute(EHFrameInfo.FunctionEHSym, +                                           MCStreamer::NoDeadStrip);    } else {      O << *EHFrameInfo.FunctionEHSym << ":\n"; @@ -313,8 +314,9 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {      // on unused functions (calling undefined externals) being dead-stripped to      // link correctly.  Yes, there really is.      if (MMI->isUsedFunction(EHFrameInfo.function)) -      if (const char *UsedDirective = MAI->getUsedDirective()) -        O << UsedDirective << *EHFrameInfo.FunctionEHSym << "\n\n"; +      if (MAI->hasNoDeadStrip()) +        Asm->OutStreamer.EmitSymbolAttribute(EHFrameInfo.FunctionEHSym, +                                             MCStreamer::NoDeadStrip);    }    Asm->O << '\n';  } @@ -982,7 +984,7 @@ void DwarfException::EndFunction() {    EmitLabel("eh_func_end", SubprogramCount);    EmitExceptionTable(); -  const MCSymbol *FunctionEHSym = +  MCSymbol *FunctionEHSym =      Asm->GetSymbolWithGlobalValueBase(MF->getFunction(), ".eh",                                        Asm->MAI->is_EHSymbolPrivate()); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfException.h b/llvm/lib/CodeGen/AsmPrinter/DwarfException.h index 143e0e02d5f..3921e91ea50 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfException.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfException.h @@ -34,7 +34,7 @@ class raw_ostream;  ///  class DwarfException : public DwarfPrinter {    struct FunctionEHFrameInfo { -    const MCSymbol *FunctionEHSym;  // L_foo.eh +    MCSymbol *FunctionEHSym;  // L_foo.eh      unsigned Number;      unsigned PersonalityIndex;      bool hasCalls; @@ -42,7 +42,7 @@ class DwarfException : public DwarfPrinter {      std::vector<MachineMove> Moves;      const Function *function; -    FunctionEHFrameInfo(const MCSymbol *EHSym, unsigned Num, unsigned P, +    FunctionEHFrameInfo(MCSymbol *EHSym, unsigned Num, unsigned P,                          bool hC, bool hL,                          const std::vector<MachineMove> &M,                          const Function *f): diff --git a/llvm/lib/MC/MCAsmInfo.cpp b/llvm/lib/MC/MCAsmInfo.cpp index cc036141574..ef6dd071e03 100644 --- a/llvm/lib/MC/MCAsmInfo.cpp +++ b/llvm/lib/MC/MCAsmInfo.cpp @@ -57,7 +57,7 @@ MCAsmInfo::MCAsmInfo() {    COMMDirectiveTakesAlignment = true;    HasDotTypeDotSizeDirective = true;    HasSingleParameterDotFile = true; -  UsedDirective = 0; +  HasNoDeadStrip = false;    WeakRefDirective = 0;    WeakDefDirective = 0;    LinkOnceDirective = 0; diff --git a/llvm/lib/MC/MCAsmInfoDarwin.cpp b/llvm/lib/MC/MCAsmInfoDarwin.cpp index 664a55c0888..a66a83d0144 100644 --- a/llvm/lib/MC/MCAsmInfoDarwin.cpp +++ b/llvm/lib/MC/MCAsmInfoDarwin.cpp @@ -39,7 +39,7 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() {    SetDirective = "\t.set";    ProtectedDirective = "\t.globl\t";    HasDotTypeDotSizeDirective = false; -  UsedDirective = "\t.no_dead_strip\t"; +  HasNoDeadStrip = true;    // Note: Even though darwin has the .lcomm directive, it is just a synonym for    // zerofill, so we prefer to use .zerofill. diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp index ffdd421f4e0..4ed8ec3521c 100644 --- a/llvm/lib/MC/MCMachOStreamer.cpp +++ b/llvm/lib/MC/MCMachOStreamer.cpp @@ -234,6 +234,7 @@ void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,    case MCStreamer::Internal:    case MCStreamer::Protected:    case MCStreamer::Weak: +  case MCStreamer::Local:      assert(0 && "Invalid symbol attribute for Mach-O!");      break;  | 

