Summary: When evaluating an expression referencing a constexpr static member variable, an error is issued because the PDB does not specify a symbol with an address that can be relocated against. Rather than attempt to resolve the variable's value within the IR execution, the values of all constants can be looked up and incorporated into the AST of the record type as a literal, mirroring the original compiler AST. This change applies to DIA and native PDB loaders. Patch By: jackoalan Reviewers: aleksandr.urakov, jasonmolenda, zturner, jdoerfert, teemperor Reviewed By: aleksandr.urakov Subscribers: sstefan1, lldb-commits, llvm-commits, #lldb Tags: #lldb, #llvm Differential Revision: https://reviews.llvm.org/D82160
92 lines
3.3 KiB
Plaintext
92 lines
3.3 KiB
Plaintext
REQUIRES: system-windows, msvc
|
|
RUN: %build --compiler=msvc --nodefaultlib --output=%t.exe %S/Inputs/AstRestoreTest.cpp
|
|
RUN: env LLDB_USE_NATIVE_PDB_READER=0 lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=ENUM %s
|
|
RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=ENUM %s
|
|
RUN: lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=GLOBAL %s
|
|
RUN: lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=BASE %s
|
|
RUN: env LLDB_USE_NATIVE_PDB_READER=0 lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=CLASS %s
|
|
RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=CLASS %s
|
|
RUN: lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=INNER %s
|
|
RUN: lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=TEMPLATE %s
|
|
RUN: lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=FOO %s
|
|
RUN: lldb-test symbols -dump-ast %t.exe | FileCheck --check-prefix=MAIN %s
|
|
|
|
ENUM: Module: {{.*}}
|
|
ENUM: namespace N0 {
|
|
ENUM: namespace N1 {
|
|
ENUM: namespace {
|
|
ENUM: enum Enum {
|
|
ENUM: Enum_0,
|
|
ENUM: Enum_1,
|
|
ENUM: Enum_2,
|
|
ENUM: Enum_3
|
|
ENUM: };
|
|
ENUM: }
|
|
ENUM: }
|
|
ENUM: }
|
|
|
|
GLOBAL: Module: {{.*}}
|
|
GLOBAL: namespace N0 {
|
|
GLOBAL: namespace N1 {
|
|
GLOBAL: N0::N1::(anonymous namespace)::Enum Global;
|
|
GLOBAL: }
|
|
GLOBAL: }
|
|
|
|
BASE: Module: {{.*}}
|
|
BASE: namespace N0 {
|
|
BASE: namespace N1 {
|
|
BASE: struct Base {
|
|
BASE: N0::N1::(anonymous namespace)::Enum m_e;
|
|
BASE: };
|
|
BASE: }
|
|
BASE: }
|
|
|
|
CLASS: Module: {{.*}}
|
|
CLASS: namespace N0 {
|
|
CLASS: namespace N1 {
|
|
CLASS: class Class : public N0::N1::Base {
|
|
CLASS-DAG: const N0::N1::(anonymous namespace)::Enum m_ce;
|
|
CLASS-DAG: static int ClassStatic;
|
|
CLASS-DAG: static const int ClassStaticConst = 8;
|
|
CLASS-DAG: static const int ClassStaticConstexpr = 9;
|
|
CLASS-DAG: static constexpr float ClassStaticConstexprFloat = 10.F;
|
|
CLASS-DAG: static constexpr double ClassStaticConstexprDouble = 11.;
|
|
CLASS-DAG: static constexpr double ClassStaticConstexprLongDouble = 12.;
|
|
CLASS-DAG: static const N0::N1::(anonymous namespace)::Enum ClassStaticConstEnum = 8;
|
|
CLASS-DAG: static const N0::N1::(anonymous namespace)::ScopedEnum ClassStaticConstScopedEnum = 4;
|
|
CLASS-DAG: N0::N1::Class::Inner m_inner;
|
|
CLASS-DAG: {{(inline )?}}Class(N0::N1::(anonymous namespace)::Enum);
|
|
CLASS-DAG: static {{(inline )?}}int StaticFunc(const N0::N1::Class &);
|
|
CLASS-DAG: {{(inline )?}}int PrivateFunc(const N0::N1::Class::Inner &);
|
|
CLASS: };
|
|
CLASS: }
|
|
CLASS: }
|
|
|
|
INNER: Module: {{.*}}
|
|
INNER: namespace N0 {
|
|
INNER: namespace N1 {
|
|
INNER: class Class : public N0::N1::Base {
|
|
INNER: struct Inner {
|
|
INNER: char x;
|
|
INNER: short y;
|
|
INNER: int z;
|
|
INNER: };
|
|
INNER: };
|
|
INNER: }
|
|
INNER: }
|
|
|
|
TEMPLATE: Module: {{.*}}
|
|
TEMPLATE: struct Template<N0::N1::Class> {
|
|
TEMPLATE: inline void TemplateFunc<1>();
|
|
TEMPLATE: };
|
|
|
|
FOO: Module: {{.*}}
|
|
FOO: namespace N0 {
|
|
FOO: namespace N1 {
|
|
FOO: void foo();
|
|
FOO: }
|
|
FOO: }
|
|
|
|
MAIN: Module: {{.*}}
|
|
MAIN: int main();
|