Skip to content

Commit

Permalink
Wdeprecated: ApplyDebugLocation is returned by value yet if it is eve…
Browse files Browse the repository at this point in the history
…r copied (rather than RVO'd) that would be broken, make it movable instead

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@244838 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
dwblaikie committed Aug 12, 2015
1 parent 4264840 commit bc09bae
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 24 deletions.
55 changes: 32 additions & 23 deletions lib/CodeGen/CGDebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,54 +56,63 @@ CGDebugInfo::~CGDebugInfo() {

ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
SourceLocation TemporaryLocation)
: CGF(CGF) {
: CGF(&CGF) {
init(TemporaryLocation);
}

ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
bool DefaultToEmpty,
SourceLocation TemporaryLocation)
: CGF(CGF) {
: CGF(&CGF) {
init(TemporaryLocation, DefaultToEmpty);
}

void ApplyDebugLocation::init(SourceLocation TemporaryLocation,
bool DefaultToEmpty) {
if (auto *DI = CGF.getDebugInfo()) {
OriginalLocation = CGF.Builder.getCurrentDebugLocation();
if (TemporaryLocation.isInvalid()) {
if (DefaultToEmpty)
CGF.Builder.SetCurrentDebugLocation(llvm::DebugLoc());
else {
// Construct a location that has a valid scope, but no line info.
assert(!DI->LexicalBlockStack.empty());
CGF.Builder.SetCurrentDebugLocation(
llvm::DebugLoc::get(0, 0, DI->LexicalBlockStack.back()));
}
} else
DI->EmitLocation(CGF.Builder, TemporaryLocation);
auto *DI = CGF->getDebugInfo();
if (!DI) {
CGF = nullptr;
return;
}

OriginalLocation = CGF->Builder.getCurrentDebugLocation();
if (TemporaryLocation.isValid()) {
DI->EmitLocation(CGF->Builder, TemporaryLocation);
return;
}

if (DefaultToEmpty) {
CGF->Builder.SetCurrentDebugLocation(llvm::DebugLoc());
return;
}

// Construct a location that has a valid scope, but no line info.
assert(!DI->LexicalBlockStack.empty());
CGF->Builder.SetCurrentDebugLocation(
llvm::DebugLoc::get(0, 0, DI->LexicalBlockStack.back()));
}

ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E)
: CGF(CGF) {
: CGF(&CGF) {
init(E->getExprLoc());
}

ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc)
: CGF(CGF) {
if (CGF.getDebugInfo()) {
OriginalLocation = CGF.Builder.getCurrentDebugLocation();
if (Loc)
CGF.Builder.SetCurrentDebugLocation(std::move(Loc));
: CGF(&CGF) {
if (!CGF.getDebugInfo()) {
this->CGF = nullptr;
return;
}
OriginalLocation = CGF.Builder.getCurrentDebugLocation();
if (Loc)
CGF.Builder.SetCurrentDebugLocation(std::move(Loc));
}

ApplyDebugLocation::~ApplyDebugLocation() {
// Query CGF so the location isn't overwritten when location updates are
// temporarily disabled (for C++ default function arguments)
if (CGF.getDebugInfo())
CGF.Builder.SetCurrentDebugLocation(std::move(OriginalLocation));
if (CGF)
CGF->Builder.SetCurrentDebugLocation(std::move(OriginalLocation));
}

void CGDebugInfo::setLocation(SourceLocation Loc) {
Expand Down
5 changes: 4 additions & 1 deletion lib/CodeGen/CGDebugInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -502,13 +502,16 @@ class ApplyDebugLocation {
SourceLocation TemporaryLocation);

llvm::DebugLoc OriginalLocation;
CodeGenFunction &CGF;
CodeGenFunction *CGF;

public:
/// Set the location to the (valid) TemporaryLocation.
ApplyDebugLocation(CodeGenFunction &CGF, SourceLocation TemporaryLocation);
ApplyDebugLocation(CodeGenFunction &CGF, const Expr *E);
ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc);
ApplyDebugLocation(ApplyDebugLocation &&Other) : CGF(Other.CGF) {
Other.CGF = nullptr;
}

~ApplyDebugLocation();

Expand Down

0 comments on commit bc09bae

Please sign in to comment.