mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-10 19:34:29 +00:00
Set the debug location for landing pad code to the canonical EH location.
It used to point to the first call that caused the landing pad to be generated. rdar://problem/13888152 llvm-svn: 181958
This commit is contained in:
parent
dc237b52bc
commit
5e5ff6e170
@ -206,6 +206,9 @@ public:
|
||||
/// invalid it is ignored.
|
||||
void setLocation(SourceLocation Loc);
|
||||
|
||||
/// getLocation - Return the current source location.
|
||||
SourceLocation getLocation() const { return CurLoc; }
|
||||
|
||||
/// EmitLocation - Emit metadata to indicate a change in line/column
|
||||
/// information in the source file.
|
||||
/// \param ForceColumnInfo Assume DebugColumnInfo option is true.
|
||||
|
@ -766,6 +766,11 @@ llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
|
||||
|
||||
// Save the current IR generation state.
|
||||
CGBuilderTy::InsertPoint savedIP = Builder.saveAndClearIP();
|
||||
SourceLocation SavedLocation;
|
||||
if (CGDebugInfo *DI = getDebugInfo()) {
|
||||
SavedLocation = DI->getLocation();
|
||||
DI->EmitLocation(Builder, CurEHLocation);
|
||||
}
|
||||
|
||||
const EHPersonality &personality = EHPersonality::get(getLangOpts());
|
||||
|
||||
@ -887,6 +892,8 @@ llvm::BasicBlock *CodeGenFunction::EmitLandingPad() {
|
||||
|
||||
// Restore the old IR generation state.
|
||||
Builder.restoreIP(savedIP);
|
||||
if (CGDebugInfo *DI = getDebugInfo())
|
||||
DI->EmitLocation(Builder, SavedLocation);
|
||||
|
||||
return lpad;
|
||||
}
|
||||
|
69
clang/test/CodeGenCXX/lpad-linetable.cpp
Normal file
69
clang/test/CodeGenCXX/lpad-linetable.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -emit-llvm -g -triple x86_64-apple-darwin10 %s -o - | FileCheck %s
|
||||
// The landing pad should have the line number of the closing brace of the function.
|
||||
// rdar://problem/13888152
|
||||
// CHECK: ret i32
|
||||
// CHECK: landingpad {{.*}}
|
||||
// CHECK-NEXT: !dbg ![[LPAD:[0-9]+]]
|
||||
// CHECK: ![[LPAD]] = metadata !{i32 24, i32 0, metadata !{{.*}}, null}
|
||||
|
||||
# 1 "/usr/include/c++/4.2.1/vector" 1 3
|
||||
typedef long unsigned int __darwin_size_t;
|
||||
typedef __darwin_size_t size_t;
|
||||
namespace std {
|
||||
template<typename _Tp>
|
||||
class allocator
|
||||
{
|
||||
public:
|
||||
template<typename _Tp1>
|
||||
struct rebind
|
||||
{ typedef allocator<_Tp1> other; };
|
||||
~allocator() throw() { }
|
||||
};
|
||||
template<typename _Tp, typename _Alloc>
|
||||
struct _Vector_base
|
||||
{
|
||||
typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
|
||||
struct _Vector_impl
|
||||
{
|
||||
_Vector_impl(_Tp_alloc_type const& __a) { }
|
||||
};
|
||||
typedef _Alloc allocator_type;
|
||||
_Vector_base(const allocator_type& __a)
|
||||
: _M_impl(__a)
|
||||
{ }
|
||||
~_Vector_base() { }
|
||||
_Vector_impl _M_impl;
|
||||
};
|
||||
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
|
||||
class vector
|
||||
: protected _Vector_base<_Tp, _Alloc>
|
||||
{
|
||||
typedef _Vector_base<_Tp, _Alloc> _Base;
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
typedef size_t size_type;
|
||||
typedef _Alloc allocator_type;
|
||||
vector(const allocator_type& __a = allocator_type())
|
||||
: _Base(__a)
|
||||
{ }
|
||||
size_type
|
||||
push_back(const value_type& __x)
|
||||
{}
|
||||
};
|
||||
}
|
||||
# 10 "main.cpp" 2
|
||||
|
||||
|
||||
|
||||
|
||||
int main (int argc, char const *argv[], char const *envp[])
|
||||
{ // 15
|
||||
std::vector<long> longs;
|
||||
std::vector<short> shorts;
|
||||
for (int i=0; i<12; i++)
|
||||
{
|
||||
longs.push_back(i);
|
||||
shorts.push_back(i);
|
||||
}
|
||||
return 0; // 23
|
||||
} // 24
|
Loading…
x
Reference in New Issue
Block a user