mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 19:36:05 +00:00

Summary: These flags are used when emitting debug info and needed to initialize subprogram and member function attributes (function options) for Codeview. These function options are used to create an accurate compiler type for UDT symbols (class/struct/union) from PDBs. The Trivial flag was introduced in https://reviews.llvm.org/D45122 It's been pointed out that Trivial and NonTrivial may imply each other and that seems to be the case in the current tests. This change combines them into a single flag -- NonTrivial -- and updates the corresponding unit tests. There is an additional change to llvm to update the flags. Reviewers: rnk, zturner, dblaikie, probinson, Hui Reviewed By: dblaikie Subscribers: aprantl, jdoerfert, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D59347 llvm-svn: 358219
97 lines
2.9 KiB
C++
97 lines
2.9 KiB
C++
// RUN: %clang_cc1 -emit-llvm -debug-info-kind=standalone -triple %itanium_abi_triple %s -o - | FileCheck %s
|
|
|
|
// Cases to show some non-trivial types with flags combined with DIFlagNonTrivial and DIFlagTypePassByValue.
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "Explicit",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
|
|
struct Explicit {
|
|
explicit Explicit();
|
|
int a;
|
|
} Explicit;
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "Struct",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
|
|
struct Struct {
|
|
Struct() {}
|
|
} Struct;
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "Annotated",{{.*}}flags: DIFlagTypePassByValue | DIFlagNonTrivial
|
|
struct __attribute__((trivial_abi)) Annotated {
|
|
Annotated() {};
|
|
} Annotated;
|
|
|
|
|
|
// Check a non-composite type
|
|
// CHECK-DAG: !DIGlobalVariable(name: "GlobalVar", {{.*}}type: {{.*}}, isLocal: false, isDefinition: true)
|
|
int GlobalVar = 0;
|
|
|
|
// Cases to test composite type's triviality
|
|
|
|
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "Union",
|
|
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
|
|
union Union {
|
|
int a;
|
|
} Union;
|
|
|
|
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "Trivial",
|
|
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
|
|
struct Trivial {
|
|
int i;
|
|
} Trivial;
|
|
|
|
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialA",
|
|
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
|
|
struct TrivialA {
|
|
TrivialA() = default;
|
|
} TrivialA;
|
|
|
|
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialB",
|
|
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
|
|
struct TrivialB {
|
|
int m;
|
|
TrivialB(int x) { m = x; }
|
|
TrivialB() = default;
|
|
} TrivialB;
|
|
|
|
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialC",
|
|
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
|
|
struct TrivialC {
|
|
struct Trivial x;
|
|
} TrivialC;
|
|
|
|
// CHECK-DAG: {{.*}}!DIGlobalVariable(name: "TrivialD",
|
|
// CHECK-DAG-NEXT: {{^((?!\bDIFlagNonTrivial\b).)*$}}
|
|
struct NT {
|
|
NT() {};
|
|
};
|
|
struct TrivialD {
|
|
static struct NT x; // Member is non-trivial but is static.
|
|
} TrivialD;
|
|
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivial",{{.*}}flags: {{.*}}DIFlagNonTrivial
|
|
struct NonTrivial {
|
|
NonTrivial() {}
|
|
} NonTrivial;
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialA",{{.*}}flags: {{.*}}DIFlagNonTrivial
|
|
struct NonTrivialA {
|
|
~NonTrivialA();
|
|
} NonTrivialA;
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialB",{{.*}}flags: {{.*}}DIFlagNonTrivial
|
|
struct NonTrivialB {
|
|
struct NonTrivial x;
|
|
} NonTrivialB;
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialC",{{.*}}flags: {{.*}}DIFlagNonTrivial
|
|
struct NonTrivialC {
|
|
virtual void f() {}
|
|
} NonTrivialC;
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialD",{{.*}}flags: {{.*}}DIFlagNonTrivial
|
|
struct NonTrivialD : NonTrivial {
|
|
} NonTrivialD;
|
|
|
|
// CHECK-DAG: !DICompositeType({{.*}}, name: "NonTrivialE",{{.*}}flags: {{.*}}DIFlagNonTrivial
|
|
struct NonTrivialE : Trivial, NonTrivial {
|
|
} NonTrivialE;
|