forked from OSchip/llvm-project
PR14763: Debug info for non-trivial record parameters
There seems to have been some erroneous code attempting to describe the ABI of parameters (non-trivial record parameters are passed by reference). This would break the type of the function (especially when it caused a mismatch between the type of a declaration & a definition) causing PR14763 and PR14645. llvm-svn: 183329
This commit is contained in:
parent
2f390b755a
commit
205a30d83d
|
@ -2570,22 +2570,6 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
|
||||||
if (!Ty)
|
if (!Ty)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (llvm::Argument *Arg = dyn_cast<llvm::Argument>(Storage)) {
|
|
||||||
// If Storage is an aggregate returned as 'sret' then let debugger know
|
|
||||||
// about this.
|
|
||||||
if (Arg->hasStructRetAttr())
|
|
||||||
Ty = DBuilder.createReferenceType(llvm::dwarf::DW_TAG_reference_type, Ty);
|
|
||||||
else if (CXXRecordDecl *Record = VD->getType()->getAsCXXRecordDecl()) {
|
|
||||||
// If an aggregate variable has non trivial destructor or non trivial copy
|
|
||||||
// constructor than it is pass indirectly. Let debug info know about this
|
|
||||||
// by using reference of the aggregate type as a argument type.
|
|
||||||
if (Record->hasNonTrivialCopyConstructor() ||
|
|
||||||
!Record->hasTrivialDestructor())
|
|
||||||
Ty = DBuilder.createReferenceType(llvm::dwarf::DW_TAG_reference_type,
|
|
||||||
Ty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get location information.
|
// Get location information.
|
||||||
unsigned Line = getLineNumber(VD->getLocation());
|
unsigned Line = getLineNumber(VD->getLocation());
|
||||||
unsigned Column = getColumnNumber(VD->getLocation());
|
unsigned Column = getColumnNumber(VD->getLocation());
|
||||||
|
|
|
@ -68,6 +68,20 @@ class Cls {
|
||||||
Cls obj;
|
Cls obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace pr14763 {
|
||||||
|
struct foo {
|
||||||
|
foo(const foo&);
|
||||||
|
};
|
||||||
|
|
||||||
|
foo func(foo f) {
|
||||||
|
return f; // reference 'f' for now because otherwise we hit another bug
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK: [[FUNC:![0-9]*]] = {{.*}} metadata !"_ZN7pr147634funcENS_3fooE", i32 {{[0-9]*}}, metadata [[FUNC_TYPE:![0-9]*]], {{.*}} ; [ DW_TAG_subprogram ] {{.*}} [def] [func]
|
||||||
|
// CHECK: [[PR14763:![0-9]*]] = {{.*}} ; [ DW_TAG_namespace ] [pr14763]
|
||||||
|
// CHECK: [[FOO:![0-9]*]] = metadata !{i32 {{[0-9]*}}, metadata !{{[0-9]*}}, metadata [[PR14763]], {{.*}} ; [ DW_TAG_structure_type ] [foo]
|
||||||
|
}
|
||||||
|
|
||||||
namespace pr9608 { // also pr9600
|
namespace pr9608 { // also pr9600
|
||||||
struct incomplete;
|
struct incomplete;
|
||||||
incomplete (*x)[3];
|
incomplete (*x)[3];
|
||||||
|
@ -77,6 +91,9 @@ incomplete (*x)[3];
|
||||||
// CHECK: [[INCTYPE]] = {{.*}} ; [ DW_TAG_structure_type ] [incomplete]{{.*}} [fwd]
|
// CHECK: [[INCTYPE]] = {{.*}} ; [ DW_TAG_structure_type ] [incomplete]{{.*}} [fwd]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For some reason the argument for PR14763 ended up all the way down here
|
||||||
|
// CHECK: = metadata !{i32 {{[0-9]*}}, metadata [[FUNC]], {{.*}}, metadata [[FOO]], i32 0, i32 0} ; [ DW_TAG_arg_variable ] [f]
|
||||||
|
|
||||||
namespace pr16214 {
|
namespace pr16214 {
|
||||||
struct a {
|
struct a {
|
||||||
int i;
|
int i;
|
||||||
|
|
Loading…
Reference in New Issue