Files
clang-p2996/lldb/test/API/functionalities/limit-debug-info/main.cpp
Pavel Labath 1956cf1042 [lldb/DWARF] Don't treat class declarations with children as definitions
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
2020-07-27 12:58:22 +02:00

32 lines
675 B
C++

#include "onetwo.h"
struct InheritsFromOne : One {
constexpr InheritsFromOne() = default;
int member = 47;
} inherits_from_one;
struct InheritsFromTwo : Two {
constexpr InheritsFromTwo() = default;
int member = 47;
} inherits_from_two;
struct OneAsMember {
constexpr OneAsMember() = default;
member::One one;
int member = 47;
} one_as_member;
struct TwoAsMember {
constexpr TwoAsMember() = default;
member::Two two;
int member = 47;
} two_as_member;
array::One array_of_one[3];
array::Two array_of_two[3];
result::One get_one() { return result::One(124); }
result::Two get_two() { return result::Two(224); }
int main() { return get_one().member; }