[llvm-commits] [llvm-gcc-4.2] r75648 - in /llvm-gcc-4.2/trunk/gcc: llvm-debug.cpp llvm-debug.h

Devang Patel dpatel at apple.com
Tue Jul 14 11:19:18 PDT 2009


Author: dpatel
Date: Tue Jul 14 13:19:17 2009
New Revision: 75648

URL: http://llvm.org/viewvc/llvm-project?rev=75648&view=rev
Log:
Use LLVM Mangler to mangle linkage names for debug info entries.

Modified:
    llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp
    llvm-gcc-4.2/trunk/gcc/llvm-debug.h

Modified: llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp?rev=75648&r1=75647&r2=75648&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-debug.cpp Tue Jul 14 13:19:17 2009
@@ -34,7 +34,9 @@
 #include "llvm/Intrinsics.h"
 #include "llvm/Module.h"
 #include "llvm/Support/Dwarf.h"
+#include "llvm/Support/Mangler.h"
 #include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetAsmInfo.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/SmallVector.h"
 
@@ -180,12 +182,12 @@
   return Location;
 }
 
-static const char *getLinkageName(tree Node) {
+static const char *getLinkageName(tree Node, Mangler *LLVMMangler) {
 
   // Use llvm value name as linkage name if it is available.
   if (DECL_LLVM_SET_P(Node)) {
-    Value *V = DECL_LLVM(Node);
-    return V->getNameStart();
+    GlobalValue *V = dyn_cast<GlobalValue>(DECL_LLVM(Node));
+    return LLVMMangler->getValueName(V).c_str();
   }
 
   tree decl_name = DECL_NAME(Node);
@@ -208,7 +210,23 @@
 , PrevLineNo(0)
 , PrevBB(NULL)
 , RegionStack()
-{}
+{
+  assert (TheTarget && "Target is not set!");
+  const TargetAsmInfo *TAI = TheTarget->getTargetAsmInfo();
+  LLVMMangler = new Mangler(*m, TAI->getGlobalPrefix(), TAI->getPrivateGlobalPrefix());
+  // add chars used in ObjC method names so method names aren't mangled
+  LLVMMangler->markCharAcceptable('[');
+  LLVMMangler->markCharAcceptable(']');
+  LLVMMangler->markCharAcceptable('(');
+  LLVMMangler->markCharAcceptable(')');
+  LLVMMangler->markCharAcceptable('-');
+  LLVMMangler->markCharAcceptable('+');
+  LLVMMangler->markCharAcceptable(' ');
+}
+
+DebugInfo::~DebugInfo() {
+  delete LLVMMangler;
+}
 
 /// EmitFunctionStart - Constructs the debug code for entering a function -
 /// "llvm.dbg.func.start."
@@ -216,13 +234,12 @@
                                   BasicBlock *CurBB) {
   // Gather location information.
   expanded_location Loc = GetNodeLocation(FnDecl, false);
-  const char *LinkageName = getLinkageName(FnDecl);
 
   DISubprogram SP = 
     DebugFactory.CreateSubprogram(findRegion(FnDecl),
                                   lang_hooks.dwarf_name(FnDecl, 0),
                                   lang_hooks.dwarf_name(FnDecl, 0),
-                                  LinkageName,
+                                  LLVMMangler->getValueName(Fn),
                                   getOrCreateCompileUnit(Loc.file), CurLineNo,
                                   getOrCreateType(TREE_TYPE(FnDecl)),
                                   Fn->hasInternalLinkage(),
@@ -355,7 +372,7 @@
   DebugFactory.CreateGlobalVariable(getOrCreateCompileUnit(Loc.file), 
                                     GV->getNameStr(), 
                                     DispName,
-                                    getLinkageName(decl), 
+                                    LLVMMangler->getValueName(GV),
                                     getOrCreateCompileUnit(Loc.file), Loc.line,
                                     TyD, GV->hasInternalLinkage(),
                                     true/*definition*/, GV);
@@ -671,7 +688,7 @@
     expanded_location MemLoc = GetNodeLocation(Member, false);
     
     const char *MemberName = lang_hooks.dwarf_name(Member, 0);        
-    const char *LinkageName = getLinkageName(Member);
+    const char *LinkageName = getLinkageName(Member, LLVMMangler);
     DIType SPTy = getOrCreateType(TREE_TYPE(Member));
     DISubprogram SP = 
       DebugFactory.CreateSubprogram(findRegion(Member), MemberName, MemberName,

Modified: llvm-gcc-4.2/trunk/gcc/llvm-debug.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-debug.h?rev=75648&r1=75647&r2=75648&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-debug.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-debug.h Tue Jul 14 13:19:17 2009
@@ -47,12 +47,14 @@
 class CallInst;
 class Function;
 class Module;
+class Mangler;
 
 /// DebugInfo - This class gathers all debug information during compilation and
 /// is responsible for emitting to llvm globals or pass directly to the backend.
 class DebugInfo {
 private:
   Module *M;                            // The current module.
+  Mangler *LLVMMangler;                 // The mangler to mangle linkage names.
   DIFactory DebugFactory;               
   const char *CurFullPath;              // Previous location file encountered.
   int CurLineNo;                        // Previous location line# encountered.
@@ -69,6 +71,7 @@
   std::map<tree_node *, DIDescriptor> RegionMap;
 public:
   DebugInfo(Module *m);
+  ~DebugInfo();
 
   /// Initialize - Initialize debug info by creating compile unit for
   /// main_input_filename. This must be invoked after language dependent





More information about the llvm-commits mailing list