[llvm-commits] [llvm] r75610 - in /llvm/trunk: include/llvm/Support/Mangler.h lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp lib/VMCore/Mangler.cpp test/CodeGen/X86/loop-hoist.ll

Bill Wendling isanbard at gmail.com
Tue Jul 14 02:08:41 PDT 2009


Chris,

This patch killed the build bots last night. There were too many  
dependent patches after it to back this out. Please look into the  
failure.

	http://smooshlab.apple.com:8010/builders/llvm-gcc-i386-darwin9/builds/1098

Thanks!

-bw

On Jul 13, 2009, at 11:04 PM, Chris Lattner wrote:

> Author: lattner
> Date: Tue Jul 14 01:04:35 2009
> New Revision: 75610
>
> URL: http://llvm.org/viewvc/llvm-project?rev=75610&view=rev
> Log:
> Change the X86 asmprinter to use the mangler to apply suffixes like  
> "$non_lazy_ptr"
> to symbols instead of doing it with "printSuffixedName".  This gets  
> us to the point
> where there is a real separation between computing a symbol name and  
> printing it,
> something I need for MC printer stuff.
>
> This patch also fixes a corner case bug where unnamed private  
> globals wouldn't get
> the private label prefix.
>
> Next up, rename all uses of getValueName -> getMangledName for  
> better greppability,
> and then tackle the ppc/arm backends to eliminate "printSuffixedName".
>
>
> Modified:
>    llvm/trunk/include/llvm/Support/Mangler.h
>    llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
>    llvm/trunk/lib/VMCore/Mangler.cpp
>    llvm/trunk/test/CodeGen/X86/loop-hoist.ll
>
> Modified: llvm/trunk/include/llvm/Support/Mangler.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Mangler.h?rev=75610&r1=75609&r2=75610&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/include/llvm/Support/Mangler.h (original)
> +++ llvm/trunk/include/llvm/Support/Mangler.h Tue Jul 14 01:04:35 2009
> @@ -82,10 +82,17 @@
>     return (AcceptableChars[X/32] & (1 << (X&31))) != 0;
>   }
>
> -  /// getValueName - Returns the mangled name of V, an LLVM Value,
> -  /// in the current module.
> +  /// getMangledName - Returns the mangled name of V, an LLVM Value,
> +  /// in the current module.  If 'Suffix' is specified, the name  
> ends with the
> +  /// specified suffix.  If 'ForcePrivate' is specified, the label  
> is specified
> +  /// to have a private label prefix.
>   ///
> -  std::string getValueName(const GlobalValue *V, const char *Suffix  
> = "");
> +  std::string getMangledName(const GlobalValue *V, const char  
> *Suffix = "",
> +                             bool ForcePrivate = false);
> +
> +  std::string getValueName(const GlobalValue *V, const char *Suffix  
> = "") {
> +    return getMangledName(V, Suffix);
> +  }
>
>   /// makeNameProper - We don't want identifier names with ., space,  
> or
>   /// - in them, so we mangle these characters into the strings "d_",
>
> Modified: llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp?rev=75610&r1=75609&r2=75610&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp  
> (original)
> +++ llvm/trunk/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp Tue  
> Jul 14 01:04:35 2009
> @@ -233,7 +233,7 @@
>   EmitConstantPool(MF.getConstantPool());
>
>   if (F->hasDLLExportLinkage())
> -    DLLExportedFns.insert(Mang->getValueName(F));
> +    DLLExportedFns.insert(Mang->getMangledName(F));
>
>   // Print the 'header' of function
>   emitFunctionHeader(MF);
> @@ -304,62 +304,58 @@
>     break;
>   case MachineOperand::MO_GlobalAddress: {
>     const GlobalValue *GV = MO.getGlobal();
> -    std::string Name = Mang->getValueName(GV);
> -    decorateName(Name, GV);
>
> -    bool needCloseParen = false;
> -    if (Name[0] == '$') {
> -      // The name begins with a dollar-sign. In order to avoid  
> having it look
> -      // like an integer immediate to the assembler, enclose it in  
> parens.
> -      O << '(';
> -      needCloseParen = true;
> -    }
> +    const char *Suffix = "";
> +
> +    if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB)
> +      Suffix = "$stub";
> +    else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
> +             MO.getTargetFlags() ==  
> X86II::MO_DARWIN_NONLAZY_PIC_BASE ||
> +             MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY  
> ||
> +             MO.getTargetFlags() ==  
> X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE)
> +      Suffix = "$non_lazy_ptr";
> +
> +    std::string Name = Mang->getMangledName(GV, Suffix, Suffix[0] ! 
> = '\0');
> +    decorateName(Name, GV);
>
>     // Handle dllimport linkage.
> -    if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) {
> -      O << "__imp_" << Name;
> -    } else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
> -               MO.getTargetFlags() ==  
> X86II::MO_DARWIN_NONLAZY_PIC_BASE) {
> +    if (MO.getTargetFlags() == X86II::MO_DLLIMPORT)
> +      Name = "__imp_" + Name;
> +
> +    if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY ||
> +        MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE)
>       GVStubs.insert(Name);
> -      printSuffixedName(Name, "$non_lazy_ptr");
> -    } else if (MO.getTargetFlags() ==  
> X86II::MO_DARWIN_HIDDEN_NONLAZY ||
> -               MO.getTargetFlags() ==  
> X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE){
> +    else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY  
> ||
> +             MO.getTargetFlags() ==  
> X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE)
>       HiddenGVStubs.insert(Name);
> -      printSuffixedName(Name, "$non_lazy_ptr");
> -    } else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
> +    else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB)
>       FnStubs.insert(Name);
> -      printSuffixedName(Name, "$stub");
> -    } else {
> -      O << Name;
> -    }
>
> -    if (needCloseParen)
> -      O << ')';
> +    // If the name begins with a dollar-sign, enclose it in  
> parens.  We do this
> +    // to avoid having it look like an integer immediate to the  
> assembler.
> +    if (Name[0] == '$')
> +      O << '(' << Name << ')';
> +    else
> +      O << Name;
>
>     printOffset(MO.getOffset());
>     break;
>   }
>   case MachineOperand::MO_ExternalSymbol: {
> -    bool needCloseParen = false;
>     std::string Name(TAI->getGlobalPrefix());
>     Name += MO.getSymbolName();
> -
> -    if (Name[0] == '$') {
> -      // The name begins with a dollar-sign. In order to avoid  
> having it look
> -      // like an integer immediate to the assembler, enclose it in  
> parens.
> -      O << '(';
> -      needCloseParen = true;
> -    }
> -
> +
>     if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) {
> +      Name += "$stub";
>       FnStubs.insert(Name);
> -      printSuffixedName(Name, "$stub");
> -    } else {
> -      O << Name;
>     }
>
> -    if (needCloseParen)
> -      O << ')';
> +    // If the name begins with a dollar-sign, enclose it in  
> parens.  We do this
> +    // to avoid having it look like an integer immediate to the  
> assembler.
> +    if (Name[0] == '$')
> +      O << '(' << Name << ')';
> +    else
> +      O << Name;
>     break;
>   }
>   }
> @@ -787,7 +783,7 @@
>     return;
>   }
>
> -  std::string name = Mang->getValueName(GVar);
> +  std::string name = Mang->getMangledName(GVar);
>   Constant *C = GVar->getInitializer();
>   if (isa<MDNode>(C) || isa<MDString>(C))
>     return;
> @@ -903,6 +899,20 @@
>   EmitGlobalConstant(C);
> }
>
> +/// PrintWithoutDarwinSuffix - Print a name that has a suffix  
> appended to it
> +/// without the suffix.  This is used for darwin stub emission,  
> where we have to
> +/// be careful to remove the suffix even if the name is quoted.
> +static void PrintWithoutDarwinSuffix(const char *Name, unsigned  
> NameLen,
> +                                     unsigned SuffixLen,  
> raw_ostream &O) {
> +  assert(NameLen > SuffixLen && "Invalid empty name or bogus  
> suffix");
> +  if (Name[NameLen-1] != '"') {
> +    O.write(Name, NameLen-SuffixLen);  // foo$stub -> foo
> +  } else {
> +    O.write(Name, NameLen-SuffixLen-1);  // "foo$stub" -> "foo
> +    O << '"';                            //            -> "
> +  }
> +}
> +
> bool X86ATTAsmPrinter::doFinalization(Module &M) {
>   // Print out module-level global variables here.
>   for (Module::const_global_iterator I = M.global_begin(), E =  
> M.global_end();
> @@ -910,7 +920,7 @@
>     printModuleLevelGV(I);
>
>     if (I->hasDLLExportLinkage())
> -      DLLExportedGVs.insert(Mang->getValueName(I));
> +      DLLExportedGVs.insert(Mang->getMangledName(I));
>   }
>
>   if (Subtarget->isTargetDarwin()) {
> @@ -921,11 +931,10 @@
>     if (TAI->doesSupportExceptionHandling() && MMI && !Subtarget- 
> >is64Bit()) {
>       const std::vector<Function*> &Personalities = MMI- 
> >getPersonalities();
>       for (unsigned i = 0, e = Personalities.size(); i != e; ++i) {
> -        if (Personalities[i] == 0)
> -          continue;
> -        std::string Name = Mang->getValueName(Personalities[i]);
> -        decorateName(Name, Personalities[i]);
> -        GVStubs.insert(Name);
> +        if (Personalities[i])
> +          GVStubs.insert(Mang->getMangledName(Personalities[i],
> +                                              "$non_lazy_ptr",
> +                                              true /*private  
> label*/));
>       }
>     }
>
> @@ -936,10 +945,13 @@
>         SwitchToDataSection("\t.section  
> __IMPORT,__jump_table,symbol_stubs,"
>                             "self_modifying_code+pure_instructions, 
> 5", 0);
>         const char *Name = I->getKeyData();
> -        printSuffixedName(Name, "$stub");
> -        O << ":\n"
> -             "\t.indirect_symbol " << Name << "\n"
> -             "\thlt ; hlt ; hlt ; hlt ; hlt\n";
> +        O << Name << ":\n";
> +        O << "\t.indirect_symbol ";
> +
> +        // Print the name without the $stub.
> +        PrintWithoutDarwinSuffix(Name, I->getKeyLength(),  
> strlen("$stub"), O);
> +        O << '\n';
> +        O << "\thlt ; hlt ; hlt ; hlt ; hlt\n";
>       }
>       O << '\n';
>     }
> @@ -951,8 +963,10 @@
>       for (StringSet<>::iterator I = GVStubs.begin(), E =  
> GVStubs.end();
>            I != E; ++I) {
>         const char *Name = I->getKeyData();
> -        printSuffixedName(Name, "$non_lazy_ptr");
> -        O << ":\n\t.indirect_symbol " << Name << "\n\t.long\t0\n";
> +        O << Name << ":\n\t.indirect_symbol ";
> +        PrintWithoutDarwinSuffix(Name, I->getKeyLength(),
> +                                 strlen("$non_lazy_ptr"), O);
> +        O << "\n\t.long\t0\n";
>       }
>     }
>
> @@ -962,8 +976,10 @@
>       for (StringSet<>::iterator I = HiddenGVStubs.begin(),
>            E = HiddenGVStubs.end(); I != E; ++I) {
>         const char *Name = I->getKeyData();
> -        printSuffixedName(Name, "$non_lazy_ptr");
> -        O << ":\n" << TAI->getData32bitsDirective() << Name << '\n';
> +        O << Name << ":\n" << TAI->getData32bitsDirective();
> +        PrintWithoutDarwinSuffix(Name, I->getKeyLength(),
> +                                 strlen("$non_lazy_ptr"), O);
> +        O << '\n';
>       }
>     }
>
>
> Modified: llvm/trunk/lib/VMCore/Mangler.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Mangler.cpp?rev=75610&r1=75609&r2=75610&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/VMCore/Mangler.cpp (original)
> +++ llvm/trunk/lib/VMCore/Mangler.cpp Tue Jul 14 01:04:35 2009
> @@ -116,12 +116,19 @@
>   return Result;
> }
>
> -std::string Mangler::getValueName(const GlobalValue *GV, const char  
> *Suffix) {
> +/// getMangledName - Returns the mangled name of V, an LLVM Value,
> +/// in the current module.  If 'Suffix' is specified, the name ends  
> with the
> +/// specified suffix.  If 'ForcePrivate' is specified, the label is  
> specified
> +/// to have a private label prefix.
> +///
> +std::string Mangler::getMangledName(const GlobalValue *GV, const  
> char *Suffix,
> +                                    bool ForcePrivate) {
>   assert((!isa<Function>(GV) || !cast<Function>(GV)->isIntrinsic()) &&
>          "Intrinsic functions cannot be mangled by Mangler");
>
>   if (GV->hasName())
> -    return makeNameProper(GV->getName() + Suffix, GV- 
> >hasPrivateLinkage());
> +    return makeNameProper(GV->getName() + Suffix,
> +                          GV->hasPrivateLinkage() | ForcePrivate);
>
>   // Get the ID for the global, assigning a new one if we haven't  
> got one
>   // already.
> @@ -129,7 +136,8 @@
>   if (ID == 0) ID = NextAnonGlobalID++;
>
>   // Must mangle the global into a unique ID.
> -  return "__unnamed_" + utostr(ID) + Suffix;
> +  return makeNameProper("__unnamed_" + utostr(ID) + Suffix,
> +                        GV->hasPrivateLinkage() | ForcePrivate);
> }
>
> Mangler::Mangler(Module &M, const char *prefix, const char  
> *privatePrefix)
>
> Modified: llvm/trunk/test/CodeGen/X86/loop-hoist.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/loop-hoist.ll?rev=75610&r1=75609&r2=75610&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/CodeGen/X86/loop-hoist.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/loop-hoist.ll Tue Jul 14 01:04:35 2009
> @@ -1,10 +1,10 @@
> ; RUN: llvm-as < %s | \
> ; RUN:   llc -relocation-model=dynamic-no-pic -mtriple=i686-apple- 
> darwin8.7.2 |\
> -; RUN:   grep L_Arr.non_lazy_ptr
> +; RUN:   grep LArr.non_lazy_ptr
> ; RUN: llvm-as < %s | \
> ; RUN:   llc -disable-post-RA-scheduler=true \
> ; RUN:       -relocation-model=dynamic-no-pic -mtriple=i686-apple- 
> darwin8.7.2 |\
> -; RUN:   %prcontext L_Arr.non_lazy_ptr 1 | grep {4(%esp)}
> +; RUN:   %prcontext LArr.non_lazy_ptr 1 | grep {4(%esp)}
>
> @Arr = external global [0 x i32]		; <[0 x i32]*> [#uses=1]
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list