Add CodeGen support for the nodebug attribute.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64445 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp
index 3b912ce..abcd547 100644
--- a/lib/CodeGen/CGDecl.cpp
+++ b/lib/CodeGen/CGDecl.cpp
@@ -144,7 +144,7 @@
DMEntry = llvm::ConstantExpr::getBitCast(GV, LPtrTy);
// Emit global variable debug descriptor for static vars.
- CGDebugInfo *DI = CGM.getDebugInfo();
+ CGDebugInfo *DI = getDebugInfo();
if(DI) {
DI->setLocation(D.getLocation());
DI->EmitGlobalVariable(static_cast<llvm::GlobalVariable *>(GV), &D);
@@ -224,7 +224,7 @@
DMEntry = DeclPtr;
// Emit debug info for local var declaration.
- if (CGDebugInfo *DI = CGM.getDebugInfo()) {
+ if (CGDebugInfo *DI = getDebugInfo()) {
DI->setLocation(D.getLocation());
DI->EmitDeclareOfAutoVariable(&D, DeclPtr, Builder);
}
@@ -299,7 +299,7 @@
DMEntry = DeclPtr;
// Emit debug info for param declaration.
- if (CGDebugInfo *DI = CGM.getDebugInfo()) {
+ if (CGDebugInfo *DI = getDebugInfo()) {
DI->setLocation(D.getLocation());
DI->EmitDeclareOfArgVariable(&D, DeclPtr, Builder);
}
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp
index d23547f..1d28708 100644
--- a/lib/CodeGen/CGStmt.cpp
+++ b/lib/CodeGen/CGStmt.cpp
@@ -28,7 +28,7 @@
//===----------------------------------------------------------------------===//
void CodeGenFunction::EmitStopPoint(const Stmt *S) {
- if (CGDebugInfo *DI = CGM.getDebugInfo()) {
+ if (CGDebugInfo *DI = getDebugInfo()) {
DI->setLocation(S->getLocStart());
DI->EmitStopPoint(CurFn, Builder);
}
@@ -124,7 +124,7 @@
RValue CodeGenFunction::EmitCompoundStmt(const CompoundStmt &S, bool GetLast,
llvm::Value *AggLoc, bool isAggVol) {
- CGDebugInfo *DI = CGM.getDebugInfo();
+ CGDebugInfo *DI = getDebugInfo();
if (DI) {
EnsureInsertPoint();
DI->setLocation(S.getLBracLoc());
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 322f8bf..a699317 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -23,8 +23,8 @@
using namespace CodeGen;
CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
- : CGM(cgm), Target(CGM.getContext().Target), SwitchInsn(NULL),
- CaseRangeBlock(NULL) {
+ : CGM(cgm), Target(CGM.getContext().Target), DebugInfo(0), SwitchInsn(0),
+ CaseRangeBlock(0) {
LLVMIntTy = ConvertType(getContext().IntTy);
LLVMPointerWidth = Target.getPointerWidth(0);
}
@@ -128,7 +128,7 @@
EmitReturnBlock();
// Emit debug descriptor for function end.
- if (CGDebugInfo *DI = CGM.getDebugInfo()) {
+ if (CGDebugInfo *DI = getDebugInfo()) {
DI->setLocation(EndLoc);
DI->EmitRegionEnd(CurFn, Builder);
}
@@ -168,7 +168,7 @@
// Emit subprogram debug descriptor.
// FIXME: The cast here is a huge hack.
- if (CGDebugInfo *DI = CGM.getDebugInfo()) {
+ if (CGDebugInfo *DI = getDebugInfo()) {
DI->setLocation(StartLoc);
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
DI->EmitFunctionStart(CGM.getMangledName(FD)->getName(),
@@ -197,6 +197,10 @@
void CodeGenFunction::GenerateCode(const FunctionDecl *FD,
llvm::Function *Fn) {
+ // Check if we should generate debug info for this function.
+ if (CGM.getDebugInfo() && !FD->getAttr<NodebugAttr>())
+ DebugInfo = CGM.getDebugInfo();
+
FunctionArgList Args;
if (FD->getNumParams()) {
const FunctionTypeProto* FProto = FD->getType()->getAsFunctionTypeProto();
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index ce4a424..5888055 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -55,6 +55,7 @@
namespace CodeGen {
class CodeGenModule;
class CodeGenTypes;
+ class CGDebugInfo;
class CGFunctionInfo;
class CGRecordLayout;
@@ -151,6 +152,8 @@
void EmitBranchThroughCleanup(llvm::BasicBlock *Dest);
private:
+ CGDebugInfo* DebugInfo;
+
/// LabelIDs - Track arbitrary ids assigned to labels for use in implementing
/// the GCC address-of-label extension and indirect goto. IDs are assigned to
/// labels inside getIDForAddrOfLabel().
@@ -228,6 +231,7 @@
CodeGenFunction(CodeGenModule &cgm);
ASTContext &getContext() const;
+ CGDebugInfo *getDebugInfo() { return DebugInfo; }
void GenerateObjCMethod(const ObjCMethodDecl *OMD);
diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp
index 4bca3d9..833a52b 100644
--- a/lib/Sema/SemaDeclAttr.cpp
+++ b/lib/Sema/SemaDeclAttr.cpp
@@ -1310,8 +1310,8 @@
S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
return;
}
- FunctionDecl *Fn = dyn_cast<FunctionDecl>(d);
- if (!Fn) {
+
+ if (!isa<FunctionDecl>(d)) {
S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
<< "nodebug" << "function";
return;
diff --git a/test/CodeGen/attr-nodebug.c b/test/CodeGen/attr-nodebug.c
new file mode 100644
index 0000000..c9778c4
--- /dev/null
+++ b/test/CodeGen/attr-nodebug.c
@@ -0,0 +1,12 @@
+// RUN: clang -g -emit-llvm -o %t %s &&
+// RUN: not grep 'call void @llvm.dbg.func.start' %t
+
+void t1() __attribute__((nodebug));
+
+void t1()
+{
+ int a = 10;
+
+ a++;
+}
+