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

llvm-svn: 75589
This commit is contained in:
Devang Patel
2009-07-14 02:47:58 +00:00
parent 69008332bd
commit d6c256696b
5 changed files with 29 additions and 12 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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() {

View File

@@ -1,7 +1,5 @@
// RUN: clang-cc -g -S -o %t %s
// RUN: not grep 001 %t
// XFAIL
@interface F
-(int) bar;

View File

@@ -1,7 +1,7 @@
// RUN: clang-cc -triple i386-apple-darwin9 -g -emit-llvm -o %t %s &&
// RUN: grep '@.str3 = internal constant \[8 x i8\] c"-\[A m0\]\\00"' %t &&
// RUN: grep '@.str4 = internal constant \[9 x i8\] c"\\01-\[A m0\]\\00"' %t &&
// RUN: grep '@llvm.dbg.subprogram = .* @.str3, .* @.str3, .* @.str4,' %t &&
// RUN: grep '@.str4 = internal constant \[2 x i8\] c"A\\00"' %t &&
// RUN: grep '@llvm.dbg.subprogram = .* @.str3, .* @.str3, .* @.str3,' %t &&
// RUN: grep '@llvm.dbg.composite.* = .* i32 15, i64 0, i64 8, .* i32 16' %t &&
// RUN: true