diff options
author | Devang Patel <dpatel@apple.com> | 2009-07-14 02:47:58 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-07-14 02:47:58 +0000 |
commit | 61b5f3e12c0ab5dd2e8b98bb827855420bb9869b (patch) | |
tree | f8e0575a514236c69dc844c9a52a4d053c1ad25f /lib/CodeGen | |
parent | 9df4bb32dfafd963396155df8472904dde6a6827 (diff) |
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
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGDebugInfo.cpp | 26 | ||||
-rw-r--r-- | lib/CodeGen/CGDebugInfo.h | 5 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 4 |
3 files changed, 27 insertions, 8 deletions
diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index 0344f562a7..7855b91f1f 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 @@ llvm::DIType CGDebugInfo::getOrCreateType(QualType Ty, 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 @@ void CGDebugInfo::EmitFunctionStart(const char *Name, QualType ReturnType, 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 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 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 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var, 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 ac28e5b879..5cb5f09da8 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 @@ namespace CodeGen { /// the backend. class CGDebugInfo { CodeGenModule *M; + llvm::Mangler *LLVMMangler; bool isMainCompileUnitCreated; llvm::DIFactory DebugFactory; @@ -68,7 +71,7 @@ class CGDebugInfo { 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 b516da9a72..9ac68718a5 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -52,7 +52,9 @@ CodeGenModule::CodeGenModule(ASTContext &C, const CompileOptions &compileOpts, 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() { |