summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGDebugInfo.cpp5
-rw-r--r--clang/lib/CodeGen/CGDebugInfo.h6
-rw-r--r--clang/lib/CodeGen/CGObjC.cpp3
-rw-r--r--clang/lib/CodeGen/CGStmt.cpp2
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.cpp7
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.h2
6 files changed, 15 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 2977ed22230..3138d82fb8b 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -2537,7 +2537,8 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
/// information in the source file. If the location is invalid, the
/// previous location will be reused.
void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc,
- bool ForceColumnInfo) {
+ bool ForceColumnInfo,
+ llvm::MDNode *ForceScope) {
// Update our current location
setLocation(Loc);
@@ -2556,7 +2557,7 @@ void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc,
// Update last state.
PrevLoc = CurLoc;
- llvm::MDNode *Scope = LexicalBlockStack.back();
+ llvm::MDNode *Scope = ForceScope ? ForceScope : &*LexicalBlockStack.back();
Builder.SetCurrentDebugLocation(llvm::DebugLoc::get
(getLineNumber(CurLoc),
getColumnNumber(CurLoc, ForceColumnInfo),
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index b38b9c338c9..ac31bdf3f58 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -211,13 +211,17 @@ public:
/// getLocation - Return the current source location.
SourceLocation getLocation() const { return CurLoc; }
+ /// getScope() - Return the current scope.
+ llvm::MDNode *getScope() const { return LexicalBlockStack.back(); }
+
/// EmitLocation - Emit metadata to indicate a change in line/column
/// information in the source file.
/// \param ForceColumnInfo Assume DebugColumnInfo option is true.
/// \param ForceScope Force the location to be in a specific lexical
/// scope rather than the top of LexicalBlockStack.
void EmitLocation(CGBuilderTy &Builder, SourceLocation Loc,
- bool ForceColumnInfo = false);
+ bool ForceColumnInfo = false,
+ llvm::MDNode *ForceScope = 0);
/// EmitFunctionStart - Emit a call to llvm.dbg.function.start to indicate
/// start of a new function.
diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp
index aa990143ac2..058ce5686a3 100644
--- a/clang/lib/CodeGen/CGObjC.cpp
+++ b/clang/lib/CodeGen/CGObjC.cpp
@@ -506,8 +506,7 @@ static llvm::Value *emitARCRetainLoadOfScalar(CodeGenFunction &CGF,
/// its pointer, name, and types registered in the class struture.
void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) {
StartObjCMethod(OMD, OMD->getClassInterface(), OMD->getLocStart());
- assert(isa<CompoundStmt>(OMD->getBody()));
- EmitCompoundStmtWithoutScope(*cast<CompoundStmt>(OMD->getBody()));
+ EmitStmt(OMD->getBody());
FinishFunction(OMD->getBodyRBrace());
}
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index b18ff09015a..50882c8536b 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -37,7 +37,7 @@ void CodeGenFunction::EmitStopPoint(const Stmt *S) {
Loc = S->getLocStart();
DI->EmitLocation(Builder, Loc);
- LastStopPoint = Loc;
+ LastStopPoint = std::make_pair(Loc, DI->getScope());
}
}
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index 04c60f61f88..fb668e4a168 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -209,9 +209,10 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
// all will be fine.
if (CGDebugInfo *DI = getDebugInfo()) {
if (OnlySimpleReturnStmts)
- DI->EmitLocation(Builder, LastStopPoint, false);
+ DI->EmitLocation(Builder, LastStopPoint.first,
+ false, LastStopPoint.second);
else
- DI->EmitLocation(Builder, EndLoc, false);
+ DI->EmitLocation(Builder, EndLoc, false, LastStopPoint.second);
}
// Pop any cleanups that might have been associated with the
@@ -228,7 +229,7 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
if (CGDebugInfo *DI = getDebugInfo())
if (OnlySimpleReturnStmts)
- DI->EmitLocation(Builder, EndLoc, false);
+ DI->EmitLocation(Builder, EndLoc, false, LastStopPoint.second);
}
// Emit function epilog (to return).
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index 37bbcf3f342..c11f2c91729 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -877,7 +877,7 @@ private:
unsigned NumSimpleReturnExprs;
/// The last regular (non-return) debug location (breakpoint) in the function.
- SourceLocation LastStopPoint;
+ std::pair<SourceLocation, llvm::MDNode*> LastStopPoint;
public:
/// A scope within which we are constructing the fields of an object which
OpenPOWER on IntegriCloud