Use LLVM mangler to get mangled name for debug info entry.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75589 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp
index 0344f56..7855b91 100644
--- a/lib/CodeGen/CGDebugInfo.cpp
+++ b/lib/CodeGen/CGDebugInfo.cpp
@@ -19,6 +19,7 @@
 #include "clang/AST/RecordLayout.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/FileManager.h"
+#include "clang/Basic/TargetInfo.h"
 #include "clang/Frontend/CompileOptions.h"
 #include "llvm/Constants.h"
 #include "llvm/DerivedTypes.h"
@@ -33,12 +34,22 @@
 using namespace clang;
 using namespace clang::CodeGen;
 
-CGDebugInfo::CGDebugInfo(CodeGenModule *m)
+CGDebugInfo::CGDebugInfo(CodeGenModule *m, TargetInfo *t)
   : M(m), isMainCompileUnitCreated(false), DebugFactory(M->getModule()),
     BlockLiteralGenericSet(false) {
+  LLVMMangler = new llvm::Mangler(m->getModule(), t->getUserLabelPrefix(), ".");
+  // 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(' ');
 }
 
 CGDebugInfo::~CGDebugInfo() {
+  delete LLVMMangler;
   assert(RegionStack.empty() && "Region stack mismatch, stack not empty!");
 }
 
@@ -820,8 +831,6 @@
 void CGDebugInfo::EmitFunctionStart(const char *Name, QualType ReturnType,
                                     llvm::Function *Fn,
                                     CGBuilderTy &Builder) {
-  const char *LinkageName = Name;
-  
   // Skip the asm prefix if it exists.
   //
   // FIXME: This should probably be the unmangled name?
@@ -834,7 +843,8 @@
   unsigned LineNo = SM.getPresumedLoc(CurLoc).getLine();
   
   llvm::DISubprogram SP =
-    DebugFactory.CreateSubprogram(Unit, Name, Name, LinkageName, Unit, LineNo,
+    DebugFactory.CreateSubprogram(Unit, Name, Name, LLVMMangler->getValueName(Fn), 
+                                  Unit, LineNo,
                                   getOrCreateType(ReturnType, Unit),
                                   Fn->hasInternalLinkage(), true/*definition*/);
   
@@ -969,7 +979,9 @@
                                            ArrayType::Normal, 0);
   }
 
-  DebugFactory.CreateGlobalVariable(Unit, Name, Name, "", Unit, LineNo,
+  DebugFactory.CreateGlobalVariable(Unit, Name, Name, 
+                                    LLVMMangler->getValueName(Var),
+                                    Unit, LineNo,
                                     getOrCreateType(T, Unit),
                                     Var->hasInternalLinkage(),
                                     true/*definition*/, Var);
@@ -999,7 +1011,9 @@
                                            ArrayType::Normal, 0);
   }
 
-  DebugFactory.CreateGlobalVariable(Unit, Name, Name, "", Unit, LineNo,
+  DebugFactory.CreateGlobalVariable(Unit, Name, Name, 
+                                    LLVMMangler->getValueName(Var),
+                                    Unit, LineNo,
                                     getOrCreateType(T, Unit),
                                     Var->hasInternalLinkage(),
                                     true/*definition*/, Var);
diff --git a/lib/CodeGen/CGDebugInfo.h b/lib/CodeGen/CGDebugInfo.h
index ac28e5b..5cb5f09 100644
--- a/lib/CodeGen/CGDebugInfo.h
+++ b/lib/CodeGen/CGDebugInfo.h
@@ -16,6 +16,7 @@
 
 #include "clang/AST/Type.h"
 #include "clang/Basic/SourceLocation.h"
+#include "llvm/Support/Mangler.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/Analysis/DebugInfo.h"
 #include <map>
@@ -25,6 +26,7 @@
 namespace clang {
   class VarDecl;
   class ObjCInterfaceDecl;
+  class TargetInfo;
 
 namespace CodeGen {
   class CodeGenModule;
@@ -34,6 +36,7 @@
 /// the backend.
 class CGDebugInfo {
   CodeGenModule *M;
+  llvm::Mangler *LLVMMangler;
   bool isMainCompileUnitCreated;
   llvm::DIFactory DebugFactory;
   
@@ -68,7 +71,7 @@
   llvm::DIType CreateType(const ArrayType *Ty, llvm::DICompileUnit U);
 
 public:
-  CGDebugInfo(CodeGenModule *m);
+  CGDebugInfo(CodeGenModule *m, TargetInfo *t);
   ~CGDebugInfo();
 
   /// setLocation - Update the current source location. If \arg loc is
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index b516da9..9ac6871 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -52,7 +52,9 @@
     Runtime = CreateMacObjCRuntime(*this);
 
   // If debug info generation is enabled, create the CGDebugInfo object.
-  DebugInfo = CompileOpts.DebugInfo ? new CGDebugInfo(this) : 0;
+  DebugInfo = 0;
+  if (CompileOpts.DebugInfo)
+    DebugInfo = new CGDebugInfo(this, &Context.Target);
 }
 
 CodeGenModule::~CodeGenModule() {