Summary: This effectively reverts r188124, which added code to handle (DW_AT_)declarations of structures with some kinds of children as definitions. The commit message claims this is a workaround for some kind of debug info produced by gcc. However, it does not go into specifics, so it's hard to reproduce or verify that this is indeed still a problem. Having this code is definitely a problem though, because it mistakenly declares incomplete dwarf declarations to be complete. Both clang (with -flimit-debug-info) and gcc (by default) generate DW_AT_declarations of structs with children. This happens when full debug info for a class is not emitted in a given compile unit (e.g. because of vtable homing), but the class has inline methods which are used in the given compile unit. In that case, the compilers emit a DW_AT_declaration of a class, but add a DW_TAG_subprogram child to it to describe the inlined instance of the method. Even though the class tag has some children, it definitely does not contain enough information to construct a full class definition (most notably, it lacks any members). Keeping the class as incomplete allows us to search for a real definition in other modules, helping the -flimit-debug-info flow. And in case the definition is not found we can display a error message saying that, instead of just showing an empty struct. Reviewers: clayborg, aprantl, JDevlieghere, shafik Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D83302
57 lines
805 B
C++
57 lines
805 B
C++
struct One {
|
|
int one = 142;
|
|
constexpr One() = default;
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two : One {
|
|
int two = 242;
|
|
constexpr Two() = default;
|
|
~Two() override;
|
|
};
|
|
|
|
namespace member {
|
|
struct One {
|
|
int member = 147;
|
|
constexpr One() = default;
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two {
|
|
One one;
|
|
int member = 247;
|
|
constexpr Two() = default;
|
|
virtual ~Two();
|
|
};
|
|
} // namespace member
|
|
|
|
namespace array {
|
|
struct One {
|
|
int member = 174;
|
|
constexpr One() = default;
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two {
|
|
One one[3];
|
|
int member = 274;
|
|
constexpr Two() = default;
|
|
virtual ~Two();
|
|
};
|
|
} // namespace array
|
|
|
|
namespace result {
|
|
struct One {
|
|
int member;
|
|
One(int member);
|
|
virtual ~One();
|
|
};
|
|
|
|
struct Two {
|
|
int member;
|
|
Two(int member);
|
|
One one() const;
|
|
virtual ~Two();
|
|
};
|
|
} // namespace result
|