[Lldb-commits] [lldb] [LLDB][NativePDB] Set IsDynmaicCXXType metadata for records (PR #155853)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Apr 9 08:02:10 PDT 2026
https://github.com/Nerixyz updated https://github.com/llvm/llvm-project/pull/155853
>From 233d771d7aa267c25dcefd681353da44bf8b6d49 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Thu, 28 Aug 2025 16:33:57 +0200
Subject: [PATCH 1/2] [LLDB][NativePDB] Set IsDynmaicCXXType metadata for
records
---
.../NativePDB/PdbAstBuilderClang.cpp | 19 ++-
.../SymbolFile/NativePDB/PdbAstBuilderClang.h | 5 +-
.../NativePDB/UdtRecordCompleter.cpp | 7 +
.../SymbolFile/NativePDB/UdtRecordCompleter.h | 1 +
.../SymbolFile/NativePDB/CMakeLists.txt | 11 ++
.../NativePDB/Inputs/DynamicTypes.cpp | 29 +++++
.../NativePDB/Inputs/DynamicTypes.exe | Bin 0 -> 3584 bytes
.../NativePDB/Inputs/DynamicTypes.pdb | Bin 0 -> 73728 bytes
.../NativePDB/SymbolFilePDBTests.cpp | 123 ++++++++++++++++++
9 files changed, 186 insertions(+), 9 deletions(-)
create mode 100644 lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.cpp
create mode 100644 lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.exe
create mode 100644 lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.pdb
create mode 100644 lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp
index b07302bc7c7bf..a4f6611f7b774 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.cpp
@@ -614,17 +614,24 @@ PdbAstBuilderClang::CreateModifierType(const ModifierRecord &modifier) {
}
clang::QualType PdbAstBuilderClang::CreateRecordType(PdbTypeSymId id,
- const TagRecord &record) {
+ const CVTagRecord &record) {
clang::DeclContext *context = nullptr;
std::string uname;
- std::tie(context, uname) = CreateDeclInfoForType(record, id.index);
+ std::tie(context, uname) = CreateDeclInfoForType(record.asTag(), id.index);
if (!context)
return {};
- clang::TagTypeKind ttk = TranslateUdtKind(record);
+ clang::TagTypeKind ttk = TranslateUdtKind(record.asTag());
ClangASTMetadata metadata;
metadata.SetUserID(toOpaqueUid(id));
- metadata.SetIsDynamicCXXType(false);
+ // unions can't be dynamic
+ if (record.contextKind() != CompilerContextKind::ClassOrStruct)
+ metadata.SetIsDynamicCXXType(false);
+ // If a class has a vtable, it is dynamic.
+ else if (!record.asClass().getVTableShape().isNoneType())
+ metadata.SetIsDynamicCXXType(true);
+ // else
+ // wait until the record is completed as it might have virtual bases
CompilerType ct = m_clang.CreateRecordType(
context, OptionalClangModuleID(), uname, llvm::to_underlying(ttk),
@@ -792,11 +799,9 @@ clang::QualType PdbAstBuilderClang::CreateType(PdbTypeSymId type) {
if (IsTagRecord(cvt)) {
CVTagRecord tag = CVTagRecord::create(cvt);
- if (tag.kind() == CVTagRecord::Union)
- return CreateRecordType(type.index, tag.asUnion());
if (tag.kind() == CVTagRecord::Enum)
return CreateEnumType(type.index, tag.asEnum());
- return CreateRecordType(type.index, tag.asClass());
+ return CreateRecordType(type.index, tag);
}
if (cvt.kind() == LF_ARRAY) {
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h
index 900dccc7eb5cc..41997969a18c8 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilderClang.h
@@ -50,6 +50,8 @@ struct DeclStatus {
bool resolved = false;
};
+struct CVTagRecord;
+
class PdbAstBuilderClang : public PdbAstBuilder {
public:
PdbAstBuilderClang(TypeSystemClang &clang);
@@ -114,8 +116,7 @@ class PdbAstBuilderClang : public PdbAstBuilder {
clang::QualType
CreateModifierType(const llvm::codeview::ModifierRecord &modifier);
clang::QualType CreateArrayType(const llvm::codeview::ArrayRecord &array);
- clang::QualType CreateRecordType(PdbTypeSymId id,
- const llvm::codeview::TagRecord &record);
+ clang::QualType CreateRecordType(PdbTypeSymId id, const CVTagRecord &record);
clang::QualType CreateEnumType(PdbTypeSymId id,
const llvm::codeview::EnumRecord &record);
clang::QualType
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
index 84813ad677d1c..c0204f3757afa 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.cpp
@@ -133,6 +133,7 @@ Error UdtRecordCompleter::visitKnownMember(CVMemberRecord &cvr,
// LF_VBCLASS.
if (cvr.Kind == LF_VBCLASS)
AddBaseClassForTypeIndex(base.BaseType, base.getAccess(), base.VTableIndex);
+ m_any_virtual_base = true;
return Error::success();
}
@@ -360,6 +361,12 @@ void UdtRecordCompleter::complete() {
if (auto *record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(&m_tag_decl)) {
m_ast_builder.GetClangASTImporter().SetRecordLayout(record_decl, m_layout);
}
+
+ if (auto meta = m_ast_builder.clang().GetMetadata(&m_tag_decl)) {
+ meta->SetIsDynamicCXXType(meta->GetIsDynamicCXXType().value_or(false) ||
+ m_any_virtual_base);
+ m_ast_builder.clang().SetMetadata(&m_tag_decl, *meta);
+ }
}
uint64_t
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h
index 0a6aedefa69e8..54029e1e4d28a 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h
@@ -53,6 +53,7 @@ class UdtRecordCompleter : public llvm::codeview::TypeVisitorCallbacks {
llvm::DenseMap<lldb::opaque_compiler_type_t,
llvm::SmallSet<std::pair<llvm::StringRef, CompilerType>, 8>>
&m_cxx_record_map;
+ bool m_any_virtual_base = false;
public:
UdtRecordCompleter(
diff --git a/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt b/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt
index bfd74dd5050b4..6ee198bd85aa1 100644
--- a/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt
+++ b/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt
@@ -1,5 +1,6 @@
add_lldb_unittest(SymbolFileNativePDBTests
PdbFPOProgramToDWARFExpressionTests.cpp
+ SymbolFilePDBTests.cpp
UdtRecordCompleterTests.cpp
LINK_COMPONENTS
@@ -9,6 +10,16 @@ add_lldb_unittest(SymbolFileNativePDBTests
lldbCore
lldbHost
lldbSymbol
+ lldbPluginObjectFilePECOFF
+ lldbPluginPlatformWindows
lldbPluginSymbolFileNativePDB
+ lldbPluginSymbolFilePDB # for the pdb reader setting
lldbUtilityHelpers
)
+
+set(test_inputs
+ DynamicTypes.cpp
+ DynamicTypes.exe
+ DynamicTypes.pdb)
+
+add_unittest_inputs(SymbolFileNativePDBTests "${test_inputs}")
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.cpp b/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.cpp
new file mode 100644
index 0000000000000..bbd2dfa5bbaa6
--- /dev/null
+++ b/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.cpp
@@ -0,0 +1,29 @@
+// This was used to generate `DynamicTypes.pdb`.
+
+// clang-cl /Z7 /GR- /GS- DynamicTypes.cpp -c
+// lld-link /NODEFAULTLIB /entry:main /DEBUG DynamicTypes.obj
+// rm DynamicTypes.obj
+
+struct Base {
+ virtual ~Base() = default;
+};
+
+struct UsingBase : public Base {};
+
+struct VBase {};
+
+struct UsingVBase : public virtual VBase {};
+
+struct UsingUsingVBase : public UsingVBase {};
+
+struct NotDynamic : public VBase {};
+
+void operator delete(void *, unsigned __int64 i) throw() {}
+
+int main() {
+ UsingBase ub;
+ UsingVBase uvb;
+ UsingUsingVBase uuvb;
+ NotDynamic nd;
+ return 0;
+}
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.exe b/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.exe
new file mode 100644
index 0000000000000000000000000000000000000000..b1901dc70cba0640e05b23164283b2876ce6c4c5
GIT binary patch
literal 3584
zcmeHJKWGzC82_#YNo|{^rO*ySU**6IHAJUUG92|RSBN&44*to|{5fqTxrF3eT5z!u
zA=HAKi$e#84ptC4NOcfeP)a%|x`=~=!wnrA99%U1-rc+OY;_W(lzi~r_xs-azVH3M
z_bz#N@!C8|MC5~dMe#a+!Sfgo3~mHyy?tlsxfI(OnwrT~SgBmRSxyyLCS at 2!lcjZ5
zo;6s`VCrOo6^dCsEEB~q5M}TA=;?=NGj92>bc#CK0uGtu&L|7QawSqYPaC%piRq at L
zIOaqX$7uSFn<R2Y;+_H8o8r!Xi4gJrnxYVO!eNZ)WOMM}LD<yiO_b?JPc|Xm!@k2{
zMAPANHf5%WzG0d$Ks??L^@xH!3YVNXn>%{2<4$;j0PVQ4o-bycp7?+r#~bvBLNw-a
zTkr_(fL7fNYPBiZuhlwbt-2N5yul^hJ$Tpd7W3L`RaUv9Eyv^$YgC}fh6H3?7jDRL
z at 5B8)ej6i8sDR?yW*zlLv|3D#XiNM76tdp%5(o)t%U$_y;F=%7Bb#*y;u+}m at kl=p
z0#To=)l_+)dRy)zGoUTOU+y|D5)m?hY-VTM`MkZTSX1R|@|EyVP#{WXx4U$^TLGNT
zzOxn^jRv1m9O9e|1bmPjlNsmFtQ}B)fPj!#t{%7d(V?`8zcTc4)twXhUOr+E7%!<{
zu_$;ATMw}`oZ;$sn;sV0;6HV1^5+3c{Cqt9{kh(0=LineYy3D+&*p!{%h+za^*EwC
zQ0j5+)mOseO=(^$?)Bo{(frDpfkqh=la~`};%(3NYIJR_Ef!N*TpbJZ|Ag_;q^i#)
z^ZB{L8GH=f(laKUY&tn><V;hqn3ZH=p^z at -$8&i-c`0S)=5*vHCydf8=F|lvRmf$g
z7D{>r*IAk*pG3Z1a_pk8X<^Up8^?_$NfJpQYv;M~+=_8fY>B%A__peWK4$o=fGt9w
z0GD7NLDzv-U_U}%0)K`L^$=|VM_?zQb>KLx4t)=dcZyy>KLO*tq7Izh7vLalKXezk
XC5L1OnD_=<@vj^bMlBluaR+_ at r+BwJ
literal 0
HcmV?d00001
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.pdb b/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.pdb
new file mode 100644
index 0000000000000000000000000000000000000000..28bb3d6f5a9d10af26850975a2cf17bdf6cb4bd5
GIT binary patch
literal 73728
zcmeI5du$xXeaC0-BwA0Jq#l+SMLEl|ElXaCq-jZJMCn95Y{QZzRgc=u1=R6wNv(CS
z-tJN4KZ(*9Y1*bujJRlB7_EW^jsw_jf!d8-8?6A>K%3?dyJ(9DR$B!~A1Iu-RE)X^
zT&v&j?9AQrNXd#s)sOrJ9M0qSo0;Eyc6RS}c4uy%pR1OG@<^E4xpC))4XJ&H_M|p<
zb$2gb(7Ef7f@@PMfuI9EWEw6R1 at d1A2mv7=1cZPP5CTF#2nYcoAOwVf5cr4?xF}8t
z2mv7=1cZPP5CTF#2nYcoAOwVf5ct>=Q0m=}eIKQRLO=)z0U;m+gn$qb0zyCt2mv7=
z1b*HLw0}h2QxG$SfDjM at LO=)z0U;m+gn$qb0zyCt2!X37!1<5P`5Pxsp^B|o=)V}=
zLA)J{{23lJ;g67D`eq~FZNj at v=$o)+^dB?f-6s5PBY)9^51a4{Cj5a3(Zn^o)D_h*
z=ZdthNNE<Ux}x?XrSzqA=hX#(s#Ln3)JL$9x=c(Lv~nKz8QioZ*1*t+%~0-&vKB#W
zEqpipR`~ni55pgWABTSw{%i10!aoiF9K1LoAOwVf5D)@FKnMr{As_^VfDpJeftPU?
zx8)LIJ2y~)oO1&MW)9%230Io%pCIQw;<G0G%O?H5Cj2#%PaXQ*CVbI^H=EEidQX@%
zf~$3DTQFrKvmc)NS*mQ at lfQqd^rcl!#YO2;YDzky8`rq<c)X%Hmn??OAg8<Z^sL#<
z;atE9__gpe%?A{a-#jO94td|lcuFDU_}vBn0zBO_$p13@?;^ee;kyX)2)DwE69Pg&
z2nYcoAOwVf5D)@FKnQ$X39MGF?R?mK0QWwQ+P=MeFdKO3^ugUbcBCKrC8gFFIq#vg
z{7B%JMyD#RH#+C1=xD{GQ#F;k&FG$<qB~7ZS-aZwQ|9g4d!mYtG~3l}?Cy!#WtD6l
zXiD3DSNh={4;|RO<DsDk(&(D%ge{cu-aLW64{eSb*)*8e{icjAlEoUJ0v!9okoTrq
zXN%T}cYO0;I${VF{**#o&vaU=)H$Cq{TaHq(P5f=KP<MKD|MZiP3*K)L^~aZa|&@s
z6|;Uxf$6Q<-mmDqa>c7=!*Vs1_X=L<=`xW#rR$H%bf|gl^I&+rCFr#xZ!z*{A(Cio
zUi%WOqk9$UEJL12s^!pGVRagWblFcJ|G{#&Yoe4b`Z at B7?D!vTN4 at 3#{(6+`Bb{+Q
zJ{lDoCEKj(GJ5Oudnj6OnsOtf(f0X<KD*i9|2eItyWDB&%wwX&(G>doEemV=IW4P~
znX&xW<~GWI&QxIQ-qJE%M%LnlfDjM at LO=)z0U;m+gn$qb0#{35;dgtSEi8<Cuyycv
z;=X0Rx_A)*{^KSH?zHi|PiCC1RXH7;H%Q_><rbZu*A{6b7xlD29_h_%3mJh+Aiqn^
zU8dA27LB?3eUj?hzT-$el}@9c1-Qpjlef)SPTw at K2qVzGFxje-9cpP(wV*A9G~07j
zB5{LGD>WD4yx84rb9)P5C3O~|RmNG*qB#!c3g+wnF}(nuj{TuqjW*{m1vjMImn~5X
zO at 4GwcR|~pfDMaGeq_UR+k0p1qoxtv&(@9AN!?%2(R>~BmG<6<Hfa0Iyc*Tm8aiOR
z177VY*QV`r6zw3h4r4F-XqYuBXqct#NT8mmO_f+0E9aOQ0Ge*w?7wtB8?`n at LL(0?
zku{HRt8U}MWTMG-)=kzo#cVLPH|n`W-81u#%}lTpjpUT^Mt&S`5j&OWjJ5B?XE$c3
zgU4+S^yA}<=~b*F(HLiSJu^1RAYO*)Pt8z9>zOjko60b~W`;6a4`uAQuiHbDs1Ijl
z^>d=hR(<ZE4sk+22nYcoAOwVf5D)@FKnQ#|2#o%Vqc;B~)>E%ds(*VXsRrJ3)UQ9D
zP*1FP)X-W-efx!^>K}8|>UWarjT;hb1$19~C8<9D1H3o=Y*PKoQ;z!dH<bFsUpwl@
z&nMKkS`zAk-%F||_9WEl14;GYOC0r``Oxi2s;+UY*<P4b%SIhF_J>Ke;?0Em=3|&k
z_<B-(c7vnZ?oFzH|03$!lu*vM9QE>V;)cT9YkW9pi4{UX2nYcoAOwVf5D)@FKnMr{
zAs_ at kngqH+Z=BEPZ^Es%zSri1fBKk9VcWH?YCaogm3o``$l!BH{o*_V>(WZ4yDE_$
zZuO(Z+SFUXM8l=2SM>_z9G_LgAw$=v6U>NQTB$)Bmrw`@0U;m+gn$qb0zyCt2mv7=
z1cZPPxOxJ-)jz5ny)JxDe`c3AmMIj*if*M^e#Fa#NaTkzwUQr(UJwSELlec}a$%2O
z at G=i(Lx0RWuxl`Lf2mS~%&gx&JW=t2uJZ6Bc-MbxyMy{)Q%ms{Fjo)sJ{Vb=D`ZQf
zsWGn__~lZnx4WyS3yTmosWxrLDi(s%3kaep-g1v3jyf}K;reRT5xu%@bYsCWR<%HF
zYv(!z##_~(Zeuaxj+(1wT)*HbU(0Bvl_jwHV7;*kuSICLKMM5!By36{2AlL^dD?Mb
zOdg9Ki`w3%*U~Fh8>Wo5aP7sN at Q&Jv^ftYY9`Z3NP~P1n=Nfv*wF2eqn&ezduT&||
z|CHa3(ALlXw5Yx9d_TY6^eaqIGt!A-N_`UY3KHm-erKL572=EU*-zR%gRA#*HR^Cw
zc-#*f{rDmZIBF%PdRo*r(>`81(XKyMSqf!OBW>H)>js(@_S1$`tV}Fgx8dd{8+dGA
zf_K!X at b3DycFud@xCcYUau5#Xy(-2t!I2x5bJTTd?;d0CIb(19INySH&g;4&UX6tY
z#^^={)-SyO7+Kq7cQ at +h9)%8$<onsZHKrTqe9X-0t%TgVThUIme at 6T`$2K~EBJJfE
zo59sNHy`U1l(%8PJ8Gdm*1d+^_l*r$091Fk!G>t>ku%XS)5~I_c6q#JaP at X?Z{kGV
zhjqJ)ri`(#V4nrL2ckg#XWyfJG%nxw_;HREuiMbv_iiXXu5Gv-?Ccl|j+bkN{7^1i
zC}5nK?Kbo{<MFckJYJSnAFfw)ahtiW=!~x0urixQT*;VfW<@)H_%qsR_2YIvW9+;^
zTO0kOozcE6)9t*PV~Pbm7)w~y13nkfM9Q=U^Xs1xjPsnO<M^T;k6j9$GJD;oxnxdv
z6FjG!SHLfa=ecn!d?$P#{3>|reiGicTS1)l at tR5(Z+9WmR`0Zt+3Q+d at 5Y$kd822?
zSzM1FRIHE3DmqUi8<AAJ46S7Zj_tOZaES at 69nrZJF@b1`y*y at CFFF?*<1KDSykBP^
zpv;cTxE_zKtuH$MO4)JItoJr_$(<iRZBF_p6BpVa{m$dt(+hw4x}Q0VOmRX$2nYco
zAOwWKbtAy9<Q?Yze|>7NUpnDcQ|r0E+SYb{cE46{xfS=yFJ+b5yZ7imqX=1xGtjPb
zC-dssCJ&T1?x~&qnIi$_1Tv45k7r9IFUSPBa=DVpRw_X>D=|_l6f(J5wd$3^%&=eL
z^n_c0(OoQG$q!$n8B^ylSYNJ~R~sMPziaoN9Y^*a-h2OGY9rdNPW1DRKech!?!hDX
z5>cnxgt-oUo5XitzDtqfI}_&Jisfo^yUnAnqaq2*Bv=N@{63V%pMB4w6J?OC^AO;B
zl9jNn&Fu$_?3<BnJbLRQvLnelyQ4kv)2!3HlfiQ1rW^u%hqRKY+#Hre0sLn$Xy4I5
zQk)PF0zyCt2mv7=1cZPP5CTF#2z<l|@HhTW&hK$JKi{Gj{ub}~IgfuQGG4|*hU17I
zgSU>)Ns2m=|B}sPS-LWON*y at H_&37iCVQd!6Z4GdKagW}sY7>d(*{%T*ZI!DY}ZG7
zFJ9E9B8*}-9px at kYZFnd`9I6X=TzK3 at 0zszpNSP^75F>hQ*9B)fBb_#9YRubJB^Uf
zldSBG_P_Wsl3I2iA)g^x+3(!(8-IkPmhssUpKV#$%CE2bw3YGs5TBP>*<HoqBUZ*|
zLVV6+W$$cW_KKCAxr~g at emIV7xnF(i`3aV at m^i-DZRs at gtfP$imy)&BW!-5+)m!VH
zdzB%}@i|gdZn`W58K2{&@duOZj^+4l?>KyV1{vp7*k)Qqbsl^7M}LQ;V!7ww<L&i)
z{>z)K?Byoe7Y_D)#>)PxN%q(uKl1xl_Pr+A>-W6M$Ar4Qzi*N~dg4VsqSUf;O|p2M
zKfH|W%_f<xlg}0D$kg`z+fVL!k9m|aU(XM<MO;>%JgdhUWow&c&+lKn6j{0)rlY2m
zd+6-=Ppyo{Azr6i|8~yG?rW0m-~O3CD?8jId+DFw39andWn_gW*~<B^>J>_JSQt**
zg88rbc$tfLg%;}!r+yvaoZft$m#F8xjq*`mvYy8|w<vE;J&$e7<6uI)jqA$Ai`e-D
zd5->1>1<xla+QjD at 2&UVVhaanyK+vJ>i(eOs0+MsTDKq;XUpP*fDjM at LO=)z0U;m+
zJ|F`2``|C=_GkOsCcjbZFUSb(mqQzVKpmE5g at 6zc0zyCt2mv7=1cZPP5CTF#2>cup
zi2wc{f3N+&uvdR89 at g;A-TwX`pR>{PnI}WKPUY}b0L69r%?t9eo<PgEK3*@3|H*~P
zqiU|so9!8fR at JhczfaHKB#YKTwk+pw(=*Ly(3JDH>6zvORi at cbrn%0aX|Abfn(Hl@
z<{EmYxt4OdN-XDZpK(omeK9<K=Z*RNT{W&%k1g+>>_k3)JB at 3?b$(1}>*Ctu*edJE
z4wT_<rEx8^Uj7VTHjis*?e7TgnH7c#Hb%!{%7zVmIEZ!^7#ZWXy(?Uo5pCn3mu2Yv
z9o$?&FUy#G>V~MjHEu4~vnI914Xb{o;2}1?Wz*26KDUx{Px_^N`DEZ0gRxxCJzaf$
zU3cBx+r63EUeOO-yxYNe(J$qyUJ*+$vIV{H!>hWva<PKFD28>7Zr%^Fh`J+Hk1fCm
zFI#o9LFf*9Bju{+4rg;Gyi%SrtE+dsz-|=&i0 at U6AeXJ?-LY(;=DDS8(F=6zdecg@
zRW7;3G8S?pv*PC{Lf{s>F`d<`bw{cw=2psnDfFrXrE*D|gBr5qUf#_X{A}QtMyWbd
z%!bEZuUajYb#kPFK4FnbHWv<*OFFAmcB|!DDUT8^wRH<n3c_kF7nadM))!ehQViU&
zasg&WL`G^Q(se^}2?n%vVYWKzg>J4=Lrpje?xsFnB}p*CtZYzpg9(rxA7CHYSvRbe
zJX31aD}k8q{H~#WhbbK?gk^Wk5By=j;D-}#r8Zmummt)%-Mm);cpN(%x#0o$Trp&^
zCPBH7uM;0($HUNfxxPg=k at vHsCG6MW=K>eU6EKj?Q9~&tKv$?0ORirU(KJVMI8bB0
zcarkFH(VRlBKHK448#aVm1{W%luv#*%z3{$fNPfC7-j0tDACp^vAt2^o1?^bM={%@
z==yVIjI!(~5MHk)s$Nj8RdXH<N0T^p&6=vlqAIhhDq2<*TUV7aCvXNwCX>;pa0Yoa
zT#w-rPB}lA2ttoTWEN`9WN<bYYI%KP%+Lh6AN7M;ws0t{<^6JRcW*Cpc4jh%%jH6l
z$?QACL{DG+a&bLs%!Y;HNbdb=CXNHu at +eOF6t~9-QtNOI-I2-sVsv3kJ>X-DoJ>!5
z2IE0 at nu)INuHH>O-3T+8TCS?kh8aLyd*#9LY}M0e;dQCLrY{=TrD|Ndt|J$G>eU+<
z!S$)?<+33z&&6!68eNQWS;pnH;NwFGqrT at Jo({Y!)dHNw<5?H#<64Bvc;I3)Wv|3d
zjr8XQbL^*+z9Q<v&6%#*2Wg<`a}Srzf!u}-J$<@VaKf*+<vc#_j(fQiI3wNB;)s^u
zb0|9jn{i%NaMi+RP8RzrnU5A+4Pk!lqN$5y^LeP~51(;lpp`ZFPSdH9%jYWof-ryi
zms=|FS8e(2>B1zw3W*Z}LO=)zfsYY^|2*rczdfH+xi=DO$tt|x3*QN!g1-fR4g8IP
zQg?hcq5k1;Qa$>w3H8-%QoYiiR70MlhLL~q&k}0W-zfFw;-uRD0^r~iL!1y00zyCt
z2mv7=1cZPP5CTF#2nYco at Zllwcvp|}di!^u=3Dv<w?6x9V(;EvDeUXt#pmH0xh3HJ
zc$TI%>W6arHGcbAzggF>f8UP})9K7!+v?oGyX>3)kwE?n0U;m+gn$qb0zyCt2mv7=
z1cZPP5CR_*0lmo>8viVO9{2SD?&;U*-LRDU9+v92VPmgn;Gc&4H2jlT1h5YIV~A(q
z`KX`o*>gWD{ss}J1~>)4sR6DRz;XgTJ-~PKIYnUGLsXm)5CTF#2nYcoAOwVf5D)@F
OKnMr{A at Ki1;Qs*08MKT5
literal 0
HcmV?d00001
diff --git a/lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp b/lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp
new file mode 100644
index 0000000000000..b8b67b46c1339
--- /dev/null
+++ b/lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp
@@ -0,0 +1,123 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "Plugins/ExpressionParser/Clang/ClangASTMetadata.h"
+#include "Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h"
+#include "Plugins/Platform/Windows/PlatformWindows.h"
+#include "Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h"
+#include "Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h"
+#include "Plugins/SymbolFile/PDB/SymbolFilePDB.h"
+#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
+
+#include "TestingSupport/SubsystemRAII.h"
+#include "TestingSupport/TestUtilities.h"
+
+#include "lldb/Core/Debugger.h"
+#include "lldb/Host/HostInfo.h"
+#include "lldb/Target/Platform.h"
+#include "lldb/Utility/ArchSpec.h"
+
+#include "gtest/gtest.h"
+
+#include <optional>
+
+using namespace lldb_private;
+using namespace lldb_private::npdb;
+using namespace llvm;
+
+class SymbolFilePDBTests : public testing::Test {
+public:
+ void SetUp() override {
+ m_test_exe = GetInputFilePath("DynamicTypes.exe");
+
+ ArchSpec arch("x86_64-pc-windows-msvc");
+ Platform::SetHostPlatform(PlatformWindows::CreateInstance(true, &arch));
+ m_debugger_sp = Debugger::CreateInstance();
+ m_debugger_sp->SetPropertyValue(nullptr,
+ lldb_private::eVarSetOperationAssign,
+ "plugin.symbol-file.pdb.reader", "native");
+ }
+
+ std::optional<ClangASTMetadata> GetMetadataFor(SymbolFile *symfile,
+ llvm::StringRef query,
+ TypeSystemClang *clang) {
+ TypeResults results;
+ symfile->FindTypes(TypeQuery(query), results);
+ lldb::TypeSP type_sp = results.GetFirstType();
+ if (!type_sp)
+ return std::nullopt;
+
+ CompilerType ct = type_sp->GetFullCompilerType();
+ ct.GetCompleteType();
+ if (!ct.IsValid())
+ return std::nullopt;
+
+ ct.IsPossibleDynamicType(nullptr, true, false);
+
+ clang::TagDecl *tag_decl = clang->GetAsTagDecl(ct);
+ if (!tag_decl)
+ return std::nullopt;
+
+ return clang->GetMetadata(tag_decl);
+ }
+
+protected:
+ std::string m_test_exe;
+
+ SubsystemRAII<FileSystem, HostInfo, ObjectFilePECOFF, SymbolFileNativePDB,
+ SymbolFilePDB, TypeSystemClang>
+ m_subsystems;
+ lldb::DebuggerSP m_debugger_sp;
+};
+
+TEST_F(SymbolFilePDBTests, TestDynamicCxxType) {
+ FileSpec fspec(m_test_exe);
+ ArchSpec aspec("x86_64-pc-windows");
+ lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
+
+ SymbolFile *symfile = module->GetSymbolFile();
+ ASSERT_TRUE(symfile);
+ ASSERT_TRUE(llvm::isa<SymbolFileNativePDB>(symfile));
+
+ auto ts = symfile->GetTypeSystemForLanguage(lldb::eLanguageTypeC_plus_plus);
+ ASSERT_TRUE(bool(ts));
+ TypeSystemClang *clang = llvm::dyn_cast_or_null<TypeSystemClang>(ts->get());
+ ASSERT_NE(clang, nullptr);
+
+ auto using_base_meta = GetMetadataFor(symfile, "UsingBase", clang);
+ ASSERT_TRUE(using_base_meta.has_value());
+ ASSERT_TRUE(using_base_meta->GetIsDynamicCXXType().has_value());
+ ASSERT_EQ(using_base_meta->GetIsDynamicCXXType(), true); // has vtable
+
+ auto base_meta = GetMetadataFor(symfile, "Base", clang);
+ ASSERT_TRUE(base_meta.has_value());
+ ASSERT_TRUE(base_meta->GetIsDynamicCXXType().has_value());
+ ASSERT_EQ(base_meta->GetIsDynamicCXXType(), true); // has vtable
+
+ auto vbase_meta = GetMetadataFor(symfile, "VBase", clang);
+ ASSERT_TRUE(vbase_meta.has_value());
+ ASSERT_TRUE(vbase_meta->GetIsDynamicCXXType().has_value());
+ ASSERT_EQ(vbase_meta->GetIsDynamicCXXType(), false); // empty struct
+
+ auto using_vbase_meta = GetMetadataFor(symfile, "UsingVBase", clang);
+ ASSERT_TRUE(using_vbase_meta.has_value());
+ ASSERT_TRUE(using_vbase_meta->GetIsDynamicCXXType().has_value());
+ ASSERT_EQ(using_vbase_meta->GetIsDynamicCXXType(), true); // has virtual base
+
+ auto uu_vbase_meta = GetMetadataFor(symfile, "UsingUsingVBase", clang);
+ ASSERT_TRUE(uu_vbase_meta.has_value());
+ ASSERT_TRUE(uu_vbase_meta->GetIsDynamicCXXType().has_value());
+ ASSERT_EQ(uu_vbase_meta->GetIsDynamicCXXType(),
+ true); // has 'UsingVBase' as non-virtual base
+
+ auto not_dynamic_meta = GetMetadataFor(symfile, "NotDynamic", clang);
+ ASSERT_TRUE(not_dynamic_meta.has_value());
+ ASSERT_TRUE(not_dynamic_meta->GetIsDynamicCXXType().has_value());
+ ASSERT_EQ(not_dynamic_meta->GetIsDynamicCXXType(),
+ false); // has 'VBase' as non-virtual base
+}
>From a269ddf93aa33494998da7422e6291aef761a193 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Thu, 9 Apr 2026 16:14:47 +0200
Subject: [PATCH 2/2] fix: Create binaries from YAML (almost)
---
.../SymbolFile/NativePDB/CMakeLists.txt | 6 +-
.../NativePDB/Inputs/DynamicTypes.exe | Bin 3584 -> 0 bytes
.../NativePDB/Inputs/DynamicTypes.pdb | Bin 73728 -> 0 bytes
.../NativePDB/Inputs/dynamic-types-exe.yaml | 93 ++++++
.../{DynamicTypes.cpp => dynamic-types.cpp} | 10 +-
.../NativePDB/Inputs/dynamic-types.yaml | 315 ++++++++++++++++++
.../NativePDB/SymbolFilePDBTests.cpp | 202 ++++++++++-
7 files changed, 614 insertions(+), 12 deletions(-)
delete mode 100644 lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.exe
delete mode 100644 lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.pdb
create mode 100644 lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types-exe.yaml
rename lldb/unittests/SymbolFile/NativePDB/Inputs/{DynamicTypes.cpp => dynamic-types.cpp} (52%)
create mode 100644 lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types.yaml
diff --git a/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt b/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt
index 6ee198bd85aa1..d1af3ab05568e 100644
--- a/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt
+++ b/lldb/unittests/SymbolFile/NativePDB/CMakeLists.txt
@@ -6,6 +6,7 @@ add_lldb_unittest(SymbolFileNativePDBTests
LINK_COMPONENTS
Support
DebugInfoPDB
+ TestingSupport
LINK_LIBS
lldbCore
lldbHost
@@ -18,8 +19,7 @@ add_lldb_unittest(SymbolFileNativePDBTests
)
set(test_inputs
- DynamicTypes.cpp
- DynamicTypes.exe
- DynamicTypes.pdb)
+ dynamic-types-exe.yaml
+ dynamic-types.yaml)
add_unittest_inputs(SymbolFileNativePDBTests "${test_inputs}")
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.exe b/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.exe
deleted file mode 100644
index b1901dc70cba0640e05b23164283b2876ce6c4c5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3584
zcmeHJKWGzC82_#YNo|{^rO*ySU**6IHAJUUG92|RSBN&44*to|{5fqTxrF3eT5z!u
zA=HAKi$e#84ptC4NOcfeP)a%|x`=~=!wnrA99%U1-rc+OY;_W(lzi~r_xs-azVH3M
z_bz#N@!C8|MC5~dMe#a+!Sfgo3~mHyy?tlsxfI(OnwrT~SgBmRSxyyLCS at 2!lcjZ5
zo;6s`VCrOo6^dCsEEB~q5M}TA=;?=NGj92>bc#CK0uGtu&L|7QawSqYPaC%piRq at L
zIOaqX$7uSFn<R2Y;+_H8o8r!Xi4gJrnxYVO!eNZ)WOMM}LD<yiO_b?JPc|Xm!@k2{
zMAPANHf5%WzG0d$Ks??L^@xH!3YVNXn>%{2<4$;j0PVQ4o-bycp7?+r#~bvBLNw-a
zTkr_(fL7fNYPBiZuhlwbt-2N5yul^hJ$Tpd7W3L`RaUv9Eyv^$YgC}fh6H3?7jDRL
z at 5B8)ej6i8sDR?yW*zlLv|3D#XiNM76tdp%5(o)t%U$_y;F=%7Bb#*y;u+}m at kl=p
z0#To=)l_+)dRy)zGoUTOU+y|D5)m?hY-VTM`MkZTSX1R|@|EyVP#{WXx4U$^TLGNT
zzOxn^jRv1m9O9e|1bmPjlNsmFtQ}B)fPj!#t{%7d(V?`8zcTc4)twXhUOr+E7%!<{
zu_$;ATMw}`oZ;$sn;sV0;6HV1^5+3c{Cqt9{kh(0=LineYy3D+&*p!{%h+za^*EwC
zQ0j5+)mOseO=(^$?)Bo{(frDpfkqh=la~`};%(3NYIJR_Ef!N*TpbJZ|Ag_;q^i#)
z^ZB{L8GH=f(laKUY&tn><V;hqn3ZH=p^z at -$8&i-c`0S)=5*vHCydf8=F|lvRmf$g
z7D{>r*IAk*pG3Z1a_pk8X<^Up8^?_$NfJpQYv;M~+=_8fY>B%A__peWK4$o=fGt9w
z0GD7NLDzv-U_U}%0)K`L^$=|VM_?zQb>KLx4t)=dcZyy>KLO*tq7Izh7vLalKXezk
XC5L1OnD_=<@vj^bMlBluaR+_ at r+BwJ
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.pdb b/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.pdb
deleted file mode 100644
index 28bb3d6f5a9d10af26850975a2cf17bdf6cb4bd5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 73728
zcmeI5du$xXeaC0-BwA0Jq#l+SMLEl|ElXaCq-jZJMCn95Y{QZzRgc=u1=R6wNv(CS
z-tJN4KZ(*9Y1*bujJRlB7_EW^jsw_jf!d8-8?6A>K%3?dyJ(9DR$B!~A1Iu-RE)X^
zT&v&j?9AQrNXd#s)sOrJ9M0qSo0;Eyc6RS}c4uy%pR1OG@<^E4xpC))4XJ&H_M|p<
zb$2gb(7Ef7f@@PMfuI9EWEw6R1 at d1A2mv7=1cZPP5CTF#2nYcoAOwVf5cr4?xF}8t
z2mv7=1cZPP5CTF#2nYcoAOwVf5ct>=Q0m=}eIKQRLO=)z0U;m+gn$qb0zyCt2mv7=
z1b*HLw0}h2QxG$SfDjM at LO=)z0U;m+gn$qb0zyCt2!X37!1<5P`5Pxsp^B|o=)V}=
zLA)J{{23lJ;g67D`eq~FZNj at v=$o)+^dB?f-6s5PBY)9^51a4{Cj5a3(Zn^o)D_h*
z=ZdthNNE<Ux}x?XrSzqA=hX#(s#Ln3)JL$9x=c(Lv~nKz8QioZ*1*t+%~0-&vKB#W
zEqpipR`~ni55pgWABTSw{%i10!aoiF9K1LoAOwVf5D)@FKnMr{As_^VfDpJeftPU?
zx8)LIJ2y~)oO1&MW)9%230Io%pCIQw;<G0G%O?H5Cj2#%PaXQ*CVbI^H=EEidQX@%
zf~$3DTQFrKvmc)NS*mQ at lfQqd^rcl!#YO2;YDzky8`rq<c)X%Hmn??OAg8<Z^sL#<
z;atE9__gpe%?A{a-#jO94td|lcuFDU_}vBn0zBO_$p13@?;^ee;kyX)2)DwE69Pg&
z2nYcoAOwVf5D)@FKnQ$X39MGF?R?mK0QWwQ+P=MeFdKO3^ugUbcBCKrC8gFFIq#vg
z{7B%JMyD#RH#+C1=xD{GQ#F;k&FG$<qB~7ZS-aZwQ|9g4d!mYtG~3l}?Cy!#WtD6l
zXiD3DSNh={4;|RO<DsDk(&(D%ge{cu-aLW64{eSb*)*8e{icjAlEoUJ0v!9okoTrq
zXN%T}cYO0;I${VF{**#o&vaU=)H$Cq{TaHq(P5f=KP<MKD|MZiP3*K)L^~aZa|&@s
z6|;Uxf$6Q<-mmDqa>c7=!*Vs1_X=L<=`xW#rR$H%bf|gl^I&+rCFr#xZ!z*{A(Cio
zUi%WOqk9$UEJL12s^!pGVRagWblFcJ|G{#&Yoe4b`Z at B7?D!vTN4 at 3#{(6+`Bb{+Q
zJ{lDoCEKj(GJ5Oudnj6OnsOtf(f0X<KD*i9|2eItyWDB&%wwX&(G>doEemV=IW4P~
znX&xW<~GWI&QxIQ-qJE%M%LnlfDjM at LO=)z0U;m+gn$qb0#{35;dgtSEi8<Cuyycv
z;=X0Rx_A)*{^KSH?zHi|PiCC1RXH7;H%Q_><rbZu*A{6b7xlD29_h_%3mJh+Aiqn^
zU8dA27LB?3eUj?hzT-$el}@9c1-Qpjlef)SPTw at K2qVzGFxje-9cpP(wV*A9G~07j
zB5{LGD>WD4yx84rb9)P5C3O~|RmNG*qB#!c3g+wnF}(nuj{TuqjW*{m1vjMImn~5X
zO at 4GwcR|~pfDMaGeq_UR+k0p1qoxtv&(@9AN!?%2(R>~BmG<6<Hfa0Iyc*Tm8aiOR
z177VY*QV`r6zw3h4r4F-XqYuBXqct#NT8mmO_f+0E9aOQ0Ge*w?7wtB8?`n at LL(0?
zku{HRt8U}MWTMG-)=kzo#cVLPH|n`W-81u#%}lTpjpUT^Mt&S`5j&OWjJ5B?XE$c3
zgU4+S^yA}<=~b*F(HLiSJu^1RAYO*)Pt8z9>zOjko60b~W`;6a4`uAQuiHbDs1Ijl
z^>d=hR(<ZE4sk+22nYcoAOwVf5D)@FKnQ#|2#o%Vqc;B~)>E%ds(*VXsRrJ3)UQ9D
zP*1FP)X-W-efx!^>K}8|>UWarjT;hb1$19~C8<9D1H3o=Y*PKoQ;z!dH<bFsUpwl@
z&nMKkS`zAk-%F||_9WEl14;GYOC0r``Oxi2s;+UY*<P4b%SIhF_J>Ke;?0Em=3|&k
z_<B-(c7vnZ?oFzH|03$!lu*vM9QE>V;)cT9YkW9pi4{UX2nYcoAOwVf5D)@FKnMr{
zAs_ at kngqH+Z=BEPZ^Es%zSri1fBKk9VcWH?YCaogm3o``$l!BH{o*_V>(WZ4yDE_$
zZuO(Z+SFUXM8l=2SM>_z9G_LgAw$=v6U>NQTB$)Bmrw`@0U;m+gn$qb0zyCt2mv7=
z1cZPPxOxJ-)jz5ny)JxDe`c3AmMIj*if*M^e#Fa#NaTkzwUQr(UJwSELlec}a$%2O
z at G=i(Lx0RWuxl`Lf2mS~%&gx&JW=t2uJZ6Bc-MbxyMy{)Q%ms{Fjo)sJ{Vb=D`ZQf
zsWGn__~lZnx4WyS3yTmosWxrLDi(s%3kaep-g1v3jyf}K;reRT5xu%@bYsCWR<%HF
zYv(!z##_~(Zeuaxj+(1wT)*HbU(0Bvl_jwHV7;*kuSICLKMM5!By36{2AlL^dD?Mb
zOdg9Ki`w3%*U~Fh8>Wo5aP7sN at Q&Jv^ftYY9`Z3NP~P1n=Nfv*wF2eqn&ezduT&||
z|CHa3(ALlXw5Yx9d_TY6^eaqIGt!A-N_`UY3KHm-erKL572=EU*-zR%gRA#*HR^Cw
zc-#*f{rDmZIBF%PdRo*r(>`81(XKyMSqf!OBW>H)>js(@_S1$`tV}Fgx8dd{8+dGA
zf_K!X at b3DycFud@xCcYUau5#Xy(-2t!I2x5bJTTd?;d0CIb(19INySH&g;4&UX6tY
z#^^={)-SyO7+Kq7cQ at +h9)%8$<onsZHKrTqe9X-0t%TgVThUIme at 6T`$2K~EBJJfE
zo59sNHy`U1l(%8PJ8Gdm*1d+^_l*r$091Fk!G>t>ku%XS)5~I_c6q#JaP at X?Z{kGV
zhjqJ)ri`(#V4nrL2ckg#XWyfJG%nxw_;HREuiMbv_iiXXu5Gv-?Ccl|j+bkN{7^1i
zC}5nK?Kbo{<MFckJYJSnAFfw)ahtiW=!~x0urixQT*;VfW<@)H_%qsR_2YIvW9+;^
zTO0kOozcE6)9t*PV~Pbm7)w~y13nkfM9Q=U^Xs1xjPsnO<M^T;k6j9$GJD;oxnxdv
z6FjG!SHLfa=ecn!d?$P#{3>|reiGicTS1)l at tR5(Z+9WmR`0Zt+3Q+d at 5Y$kd822?
zSzM1FRIHE3DmqUi8<AAJ46S7Zj_tOZaES at 69nrZJF@b1`y*y at CFFF?*<1KDSykBP^
zpv;cTxE_zKtuH$MO4)JItoJr_$(<iRZBF_p6BpVa{m$dt(+hw4x}Q0VOmRX$2nYco
zAOwWKbtAy9<Q?Yze|>7NUpnDcQ|r0E+SYb{cE46{xfS=yFJ+b5yZ7imqX=1xGtjPb
zC-dssCJ&T1?x~&qnIi$_1Tv45k7r9IFUSPBa=DVpRw_X>D=|_l6f(J5wd$3^%&=eL
z^n_c0(OoQG$q!$n8B^ylSYNJ~R~sMPziaoN9Y^*a-h2OGY9rdNPW1DRKech!?!hDX
z5>cnxgt-oUo5XitzDtqfI}_&Jisfo^yUnAnqaq2*Bv=N@{63V%pMB4w6J?OC^AO;B
zl9jNn&Fu$_?3<BnJbLRQvLnelyQ4kv)2!3HlfiQ1rW^u%hqRKY+#Hre0sLn$Xy4I5
zQk)PF0zyCt2mv7=1cZPP5CTF#2z<l|@HhTW&hK$JKi{Gj{ub}~IgfuQGG4|*hU17I
zgSU>)Ns2m=|B}sPS-LWON*y at H_&37iCVQd!6Z4GdKagW}sY7>d(*{%T*ZI!DY}ZG7
zFJ9E9B8*}-9px at kYZFnd`9I6X=TzK3 at 0zszpNSP^75F>hQ*9B)fBb_#9YRubJB^Uf
zldSBG_P_Wsl3I2iA)g^x+3(!(8-IkPmhssUpKV#$%CE2bw3YGs5TBP>*<HoqBUZ*|
zLVV6+W$$cW_KKCAxr~g at emIV7xnF(i`3aV at m^i-DZRs at gtfP$imy)&BW!-5+)m!VH
zdzB%}@i|gdZn`W58K2{&@duOZj^+4l?>KyV1{vp7*k)Qqbsl^7M}LQ;V!7ww<L&i)
z{>z)K?Byoe7Y_D)#>)PxN%q(uKl1xl_Pr+A>-W6M$Ar4Qzi*N~dg4VsqSUf;O|p2M
zKfH|W%_f<xlg}0D$kg`z+fVL!k9m|aU(XM<MO;>%JgdhUWow&c&+lKn6j{0)rlY2m
zd+6-=Ppyo{Azr6i|8~yG?rW0m-~O3CD?8jId+DFw39andWn_gW*~<B^>J>_JSQt**
zg88rbc$tfLg%;}!r+yvaoZft$m#F8xjq*`mvYy8|w<vE;J&$e7<6uI)jqA$Ai`e-D
zd5->1>1<xla+QjD at 2&UVVhaanyK+vJ>i(eOs0+MsTDKq;XUpP*fDjM at LO=)z0U;m+
zJ|F`2``|C=_GkOsCcjbZFUSb(mqQzVKpmE5g at 6zc0zyCt2mv7=1cZPP5CTF#2>cup
zi2wc{f3N+&uvdR89 at g;A-TwX`pR>{PnI}WKPUY}b0L69r%?t9eo<PgEK3*@3|H*~P
zqiU|so9!8fR at JhczfaHKB#YKTwk+pw(=*Ly(3JDH>6zvORi at cbrn%0aX|Abfn(Hl@
z<{EmYxt4OdN-XDZpK(omeK9<K=Z*RNT{W&%k1g+>>_k3)JB at 3?b$(1}>*Ctu*edJE
z4wT_<rEx8^Uj7VTHjis*?e7TgnH7c#Hb%!{%7zVmIEZ!^7#ZWXy(?Uo5pCn3mu2Yv
z9o$?&FUy#G>V~MjHEu4~vnI914Xb{o;2}1?Wz*26KDUx{Px_^N`DEZ0gRxxCJzaf$
zU3cBx+r63EUeOO-yxYNe(J$qyUJ*+$vIV{H!>hWva<PKFD28>7Zr%^Fh`J+Hk1fCm
zFI#o9LFf*9Bju{+4rg;Gyi%SrtE+dsz-|=&i0 at U6AeXJ?-LY(;=DDS8(F=6zdecg@
zRW7;3G8S?pv*PC{Lf{s>F`d<`bw{cw=2psnDfFrXrE*D|gBr5qUf#_X{A}QtMyWbd
z%!bEZuUajYb#kPFK4FnbHWv<*OFFAmcB|!DDUT8^wRH<n3c_kF7nadM))!ehQViU&
zasg&WL`G^Q(se^}2?n%vVYWKzg>J4=Lrpje?xsFnB}p*CtZYzpg9(rxA7CHYSvRbe
zJX31aD}k8q{H~#WhbbK?gk^Wk5By=j;D-}#r8Zmummt)%-Mm);cpN(%x#0o$Trp&^
zCPBH7uM;0($HUNfxxPg=k at vHsCG6MW=K>eU6EKj?Q9~&tKv$?0ORirU(KJVMI8bB0
zcarkFH(VRlBKHK448#aVm1{W%luv#*%z3{$fNPfC7-j0tDACp^vAt2^o1?^bM={%@
z==yVIjI!(~5MHk)s$Nj8RdXH<N0T^p&6=vlqAIhhDq2<*TUV7aCvXNwCX>;pa0Yoa
zT#w-rPB}lA2ttoTWEN`9WN<bYYI%KP%+Lh6AN7M;ws0t{<^6JRcW*Cpc4jh%%jH6l
z$?QACL{DG+a&bLs%!Y;HNbdb=CXNHu at +eOF6t~9-QtNOI-I2-sVsv3kJ>X-DoJ>!5
z2IE0 at nu)INuHH>O-3T+8TCS?kh8aLyd*#9LY}M0e;dQCLrY{=TrD|Ndt|J$G>eU+<
z!S$)?<+33z&&6!68eNQWS;pnH;NwFGqrT at Jo({Y!)dHNw<5?H#<64Bvc;I3)Wv|3d
zjr8XQbL^*+z9Q<v&6%#*2Wg<`a}Srzf!u}-J$<@VaKf*+<vc#_j(fQiI3wNB;)s^u
zb0|9jn{i%NaMi+RP8RzrnU5A+4Pk!lqN$5y^LeP~51(;lpp`ZFPSdH9%jYWof-ryi
zms=|FS8e(2>B1zw3W*Z}LO=)zfsYY^|2*rczdfH+xi=DO$tt|x3*QN!g1-fR4g8IP
zQg?hcq5k1;Qa$>w3H8-%QoYiiR70MlhLL~q&k}0W-zfFw;-uRD0^r~iL!1y00zyCt
z2mv7=1cZPP5CTF#2nYco at Zllwcvp|}di!^u=3Dv<w?6x9V(;EvDeUXt#pmH0xh3HJ
zc$TI%>W6arHGcbAzggF>f8UP})9K7!+v?oGyX>3)kwE?n0U;m+gn$qb0zyCt2mv7=
z1cZPP5CR_*0lmo>8viVO9{2SD?&;U*-LRDU9+v92VPmgn;Gc&4H2jlT1h5YIV~A(q
z`KX`o*>gWD{ss}J1~>)4sR6DRz;XgTJ-~PKIYnUGLsXm)5CTF#2nYcoAOwVf5D)@F
OKnMr{A at Ki1;Qs*08MKT5
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types-exe.yaml b/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types-exe.yaml
new file mode 100644
index 0000000000000..9260f9336b567
--- /dev/null
+++ b/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types-exe.yaml
@@ -0,0 +1,93 @@
+--- !COFF
+OptionalHeader:
+ AddressOfEntryPoint: 4128
+ ImageBase: 5368709120
+ SectionAlignment: 4096
+ FileAlignment: 512
+ MajorOperatingSystemVersion: 6
+ MinorOperatingSystemVersion: 0
+ MajorImageVersion: 0
+ MinorImageVersion: 0
+ MajorSubsystemVersion: 6
+ MinorSubsystemVersion: 0
+ Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
+ DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
+ SizeOfStackReserve: 1048576
+ SizeOfStackCommit: 4096
+ SizeOfHeapReserve: 1048576
+ SizeOfHeapCommit: 4096
+ ExportTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ImportTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ResourceTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ExceptionTable:
+ RelativeVirtualAddress: 12288
+ Size: 120
+ CertificateTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ BaseRelocationTable:
+ RelativeVirtualAddress: 16384
+ Size: 12
+ Debug:
+ RelativeVirtualAddress: 8224
+ Size: 28
+ Architecture:
+ RelativeVirtualAddress: 0
+ Size: 0
+ GlobalPtr:
+ RelativeVirtualAddress: 0
+ Size: 0
+ TlsTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ LoadConfigTable:
+ RelativeVirtualAddress: 0
+ Size: 0
+ BoundImport:
+ RelativeVirtualAddress: 0
+ Size: 0
+ IAT:
+ RelativeVirtualAddress: 0
+ Size: 0
+ DelayImportDescriptor:
+ RelativeVirtualAddress: 0
+ Size: 0
+ ClrRuntimeHeader:
+ RelativeVirtualAddress: 0
+ Size: 0
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ]
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ VirtualAddress: 4096
+ VirtualSize: 542
+ SectionData: 4883EC10488954240848890C244883C410C366666666662E0F1F8400000000004883EC48C744244400000000488D4C2438E83A000000488D4C2430BA01000000E85B000000488D4C2428BA01000000E88C000000C744244400000000488D4C2438E8CA0000008B4424444883C448C3CC4883EC3848894C2430488B4C243048894C2428E8C8000000488B442428488D0D6C0F00004889084883C438C3CCCCCCCC4883EC208954241448894C2408488B442408488904244889442418837C241400740E488B0424488D0D430F0000488908488B4424184883C420C3CCCCCCCCCCCC4883EC488954243C48894C2430488B44243048894424284889442440837C243C00740F488B442428488D0D090F0000488908488B4C242831D2E882FFFFFF488B4424404883C448C3CCCCCCCCCCCCCCCC4883EC2848894C2420488B4C2420E87D000000904883C428C3CCCCCCCCCCCCCC5048890C24488B0424488D0DA80E000048890859C3CCCCCCCCCCCCCCCCCCCCCC4883EC488954243C48894C2430488B4C243048894C242048894C24408B44243C8944242CE8270000008B44242C83E00183F800740F488B4C2420BA08000000E84CFEFFFF488B4424404883C448C3CCCC5048890C2458C3CCCCCCCCCCCCCCCCCC4883EC488954243C48894C2430488B4C243048894C242048894C24408B44243C8944242CE837FFFFFF8B44242C83E00183F800740F488B4C2420BA08000000E8ECFDFFFF488B4424404883C448C3
+ SizeOfRawData: 1024
+ - Name: .rdata
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+ VirtualAddress: 8192
+ VirtualSize: 248
+ SectionData: D01100400100000070110040010000000000000008000000000000000800000000000000AEAAD7690000000002000000690000003C2000003C080000525344535D813E868008B2FD4C4C44205044422E01000000463A5C4465765C6C6C766D2D70726F6A6563745C6C6C64625C756E697474657374735C53796D626F6C46696C655C4E61746976655044425C496E707574735C64796E616D69632D74797065732E706462000000000104010004120000010401000482000001040100046200000104010004320000010401000482000001040100044200000101010001020000010401000482000001010100010200000104010004820000
+ SizeOfRawData: 512
+ - Name: .pdata
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
+ VirtualAddress: 12288
+ VirtualSize: 120
+ SectionData: 0010000012100000A8200000201000006F100000B0200000701000009C100000B8200000A0100000DA100000C0200000E010000028110000C82000003011000049110000D02000005011000065110000D820000070110000BE110000E0200000C0110000C7110000E8200000D01100001E120000F0200000
+ SizeOfRawData: 512
+ - Name: .reloc
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ VirtualAddress: 16384
+ VirtualSize: 12
+ SectionData: 002000000C00000000A008A0
+ SizeOfRawData: 512
+symbols: []
+...
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.cpp b/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types.cpp
similarity index 52%
rename from lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.cpp
rename to lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types.cpp
index bbd2dfa5bbaa6..c2fc247116d71 100644
--- a/lldb/unittests/SymbolFile/NativePDB/Inputs/DynamicTypes.cpp
+++ b/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types.cpp
@@ -1,8 +1,10 @@
-// This was used to generate `DynamicTypes.pdb`.
+// This was used to generate `dynamic-types.yaml` and `dynamic-types-exe.yaml`.
-// clang-cl /Z7 /GR- /GS- DynamicTypes.cpp -c
-// lld-link /NODEFAULTLIB /entry:main /DEBUG DynamicTypes.obj
-// rm DynamicTypes.obj
+// clang-cl /Z7 /GR- /GS- .\dynamic-types.cpp -fuse-ld=lld-link -Og /link /nodefaultlib /entry:main
+// obj2yaml .\dynamic-types.exe -o dynamic-types-exe.yaml
+// llvm-pdbutil pdb2yaml --tpi-stream dynamic-types.pdb > dynamic-types.yaml
+// rm dynamic-types.exe
+// rm dynamic-types.pdb
struct Base {
virtual ~Base() = default;
diff --git a/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types.yaml b/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types.yaml
new file mode 100644
index 0000000000000..a2f9a64b414ab
--- /dev/null
+++ b/lldb/unittests/SymbolFile/NativePDB/Inputs/dynamic-types.yaml
@@ -0,0 +1,315 @@
+---
+MSF:
+ SuperBlock:
+ BlockSize: 4096
+ FreeBlockMap: 2
+ NumBlocks: 18
+ NumDirectoryBytes: 116
+ Unknown1: 0
+ BlockMapAddr: 3
+ NumDirectoryBlocks: 1
+ DirectoryBlocks: [ 17 ]
+ NumStreams: 0
+ FileSize: 73728
+TpiStream:
+ Version: VC80
+ Records:
+ - Kind: LF_ARGLIST
+ ArgList:
+ ArgIndices: [ 1539, 35 ]
+ - Kind: LF_PROCEDURE
+ Procedure:
+ ReturnType: 3
+ CallConv: NearC
+ Options: [ None ]
+ ParameterCount: 2
+ ArgumentList: 4096
+ - Kind: LF_ARGLIST
+ ArgList:
+ ArgIndices: [ ]
+ - Kind: LF_PROCEDURE
+ Procedure:
+ ReturnType: 116
+ CallConv: NearC
+ Options: [ None ]
+ ParameterCount: 0
+ ArgumentList: 4098
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, ForwardReference, HasUniqueName ]
+ FieldList: 0
+ Name: UsingBase
+ UniqueName: '.?AUUsingBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 0
+ - Kind: LF_VTSHAPE
+ VFTableShape:
+ Slots:
+ - Near16
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, ForwardReference, HasUniqueName ]
+ FieldList: 0
+ Name: Base
+ UniqueName: '.?AUBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 0
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_BCLASS
+ BaseClass:
+ Attrs: 3
+ Type: 4102
+ Offset: 0
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 1
+ Options: [ None, HasConstructorOrDestructor, HasUniqueName ]
+ FieldList: 4103
+ Name: UsingBase
+ UniqueName: '.?AUUsingBase@@'
+ DerivationList: 0
+ VTableShape: 4101
+ Size: 8
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4101
+ Attrs: 65548
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4102
+ Attrs: 66572
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 3
+ ClassType: 4102
+ ThisType: 4106
+ CallConv: NearC
+ Options: [ None ]
+ ParameterCount: 0
+ ArgumentList: 4098
+ ThisPointerAdjustment: 0
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_VFUNCTAB
+ VFPtr:
+ Type: 4105
+ - Kind: LF_ONEMETHOD
+ OneMethod:
+ Type: 4107
+ Attrs: 19
+ VFTableOffset: 0
+ Name: '~Base'
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 2
+ Options: [ None, HasConstructorOrDestructor, HasUniqueName ]
+ FieldList: 4108
+ Name: Base
+ UniqueName: '.?AUBase@@'
+ DerivationList: 0
+ VTableShape: 4101
+ Size: 8
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, ForwardReference, HasUniqueName ]
+ FieldList: 0
+ Name: UsingVBase
+ UniqueName: '.?AUUsingVBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 0
+ - Kind: LF_MODIFIER
+ Modifier:
+ ModifiedType: 116
+ Modifiers: [ None, Const ]
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4111
+ Attrs: 65548
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, ForwardReference, HasUniqueName ]
+ FieldList: 0
+ Name: VBase
+ UniqueName: '.?AUVBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 0
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_VBCLASS
+ VirtualBaseClass:
+ Attrs: 3
+ BaseType: 4113
+ VBPtrType: 4112
+ VBPtrOffset: 0
+ VTableIndex: 1
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 1
+ Options: [ None, HasConstructorOrDestructor, HasUniqueName ]
+ FieldList: 4114
+ Name: UsingVBase
+ UniqueName: '.?AUUsingVBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 8
+ - Kind: LF_FIELDLIST
+ FieldList: []
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, HasUniqueName ]
+ FieldList: 4116
+ Name: VBase
+ UniqueName: '.?AUVBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 1
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, ForwardReference, HasUniqueName ]
+ FieldList: 0
+ Name: UsingUsingVBase
+ UniqueName: '.?AUUsingUsingVBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 0
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_BCLASS
+ BaseClass:
+ Attrs: 3
+ Type: 4110
+ Offset: 0
+ - Kind: LF_IVBCLASS
+ VirtualBaseClass:
+ Attrs: 3
+ BaseType: 4113
+ VBPtrType: 4112
+ VBPtrOffset: 0
+ VTableIndex: 1
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 2
+ Options: [ None, HasConstructorOrDestructor, HasUniqueName ]
+ FieldList: 4119
+ Name: UsingUsingVBase
+ UniqueName: '.?AUUsingUsingVBase@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 8
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 0
+ Options: [ None, ForwardReference, HasUniqueName ]
+ FieldList: 0
+ Name: NotDynamic
+ UniqueName: '.?AUNotDynamic@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 0
+ - Kind: LF_FIELDLIST
+ FieldList:
+ - Kind: LF_BCLASS
+ BaseClass:
+ Attrs: 3
+ Type: 4113
+ Offset: 0
+ - Kind: LF_STRUCTURE
+ Class:
+ MemberCount: 1
+ Options: [ None, HasUniqueName ]
+ FieldList: 4122
+ Name: NotDynamic
+ UniqueName: '.?AUNotDynamic@@'
+ DerivationList: 0
+ VTableShape: 0
+ Size: 1
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4100
+ Attrs: 66572
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 3
+ ClassType: 4100
+ ThisType: 4124
+ CallConv: NearC
+ Options: [ None, Constructor ]
+ ParameterCount: 0
+ ArgumentList: 4098
+ ThisPointerAdjustment: 0
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4100
+ Attrs: 65548
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4110
+ Attrs: 66572
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 3
+ ClassType: 4110
+ ThisType: 4127
+ CallConv: NearC
+ Options: [ None, Constructor ]
+ ParameterCount: 0
+ ArgumentList: 4098
+ ThisPointerAdjustment: 0
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4110
+ Attrs: 65548
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4118
+ Attrs: 66572
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 3
+ ClassType: 4118
+ ThisType: 4130
+ CallConv: NearC
+ Options: [ None, Constructor ]
+ ParameterCount: 0
+ ArgumentList: 4098
+ ThisPointerAdjustment: 0
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4118
+ Attrs: 65548
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 3
+ ClassType: 4100
+ ThisType: 4124
+ CallConv: NearC
+ Options: [ None ]
+ ParameterCount: 0
+ ArgumentList: 4098
+ ThisPointerAdjustment: 0
+ - Kind: LF_MFUNCTION
+ MemberFunction:
+ ReturnType: 3
+ ClassType: 4102
+ ThisType: 4106
+ CallConv: NearC
+ Options: [ None, Constructor ]
+ ParameterCount: 0
+ ArgumentList: 4098
+ ThisPointerAdjustment: 0
+ - Kind: LF_POINTER
+ Pointer:
+ ReferentType: 4102
+ Attrs: 65548
+...
diff --git a/lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp b/lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp
index b8b67b46c1339..c293bbc4e074f 100644
--- a/lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp
+++ b/lldb/unittests/SymbolFile/NativePDB/SymbolFilePDBTests.cpp
@@ -13,6 +13,17 @@
#include "Plugins/SymbolFile/NativePDB/UdtRecordCompleter.h"
#include "Plugins/SymbolFile/PDB/SymbolFilePDB.h"
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
+#include "llvm/DebugInfo/CodeView/AppendingTypeTableBuilder.h"
+#include "llvm/DebugInfo/MSF/MSFBuilder.h"
+#include "llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h"
+#include "llvm/DebugInfo/PDB/Native/GSIStreamBuilder.h"
+#include "llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h"
+#include "llvm/DebugInfo/PDB/Native/PDBFileBuilder.h"
+#include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
+#include "llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h"
+#include "llvm/ObjectYAML/COFFYAML.h"
+#include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
+#include "llvm/ObjectYAML/yaml2obj.h"
#include "TestingSupport/SubsystemRAII.h"
#include "TestingSupport/TestUtilities.h"
@@ -29,12 +40,190 @@
using namespace lldb_private;
using namespace lldb_private::npdb;
using namespace llvm;
+using namespace llvm::codeview;
+
+namespace {
+
+struct TpiStreamYaml {
+ std::vector<CodeViewYAML::LeafRecord> records;
+};
+
+struct MinimalPdbYaml {
+ TpiStreamYaml tpi;
+ // FIXME: Take DBI section headers from YAML too.
+};
+
+} // namespace
+
+template <> struct llvm::yaml::MappingTraits<TpiStreamYaml> {
+ static void mapping(IO &io, TpiStreamYaml &tpi) {
+ io.mapRequired("Records", tpi.records);
+ }
+};
+
+template <> struct llvm::yaml::MappingTraits<MinimalPdbYaml> {
+ static void mapping(IO &io, MinimalPdbYaml &pdb) {
+ io.mapRequired("TpiStream", pdb.tpi);
+ }
+};
+
+static object::coff_section g_fixed_coff_sections[]{
+ {
+ /*.Name=*/".text",
+ /*.VirtualSize=*/ulittle32_t(542),
+ /*.VirtualAddress=*/ulittle32_t(4096),
+ /*.SizeOfRawData=*/ulittle32_t(1024),
+ /*.PointerToRawData=*/ulittle32_t(1024),
+ /*.PointerToRelocations=*/ulittle32_t(0),
+ /*.PointerToLinenumbers=*/ulittle32_t(0),
+ /*.NumberOfRelocations=*/ulittle16_t(0),
+ /*.NumberOfLinenumbers=*/ulittle16_t(0),
+ /*.Characteristics=*/
+ ulittle32_t(COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE |
+ COFF::IMAGE_SCN_MEM_READ),
+ },
+ {
+ /*.Name=*/".rdata",
+ /*.VirtualSize=*/ulittle32_t(244),
+ /*.VirtualAddress=*/ulittle32_t(8192),
+ /*.SizeOfRawData=*/ulittle32_t(512),
+ /*.PointerToRawData=*/ulittle32_t(2048),
+ /*.PointerToRelocations=*/ulittle32_t(0),
+ /*.PointerToLinenumbers=*/ulittle32_t(0),
+ /*.NumberOfRelocations=*/ulittle16_t(0),
+ /*.NumberOfLinenumbers=*/ulittle16_t(0),
+ /*.Characteristics=*/
+ ulittle32_t(COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_READ),
+ },
+ {
+ /*.Name=*/".pdata",
+ /*.VirtualSize=*/ulittle32_t(12),
+ /*.VirtualAddress=*/ulittle32_t(16384),
+ /*.SizeOfRawData=*/ulittle32_t(512),
+ /*.PointerToRawData=*/ulittle32_t(2048),
+ /*.PointerToRelocations=*/ulittle32_t(0),
+ /*.PointerToLinenumbers=*/ulittle32_t(0),
+ /*.NumberOfRelocations=*/ulittle16_t(0),
+ /*.NumberOfLinenumbers=*/ulittle16_t(0),
+ /*.Characteristics=*/
+ ulittle32_t(COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_READ),
+ },
+};
+
+/// Create a PDB from the YAML input.
+///
+/// This is essentially a trimmed down version of llvm-pdbutil's yamlToPdb which
+/// we can't use directly here.
+static Expected<std::string> createPdb() {
+ std::string input_path = GetInputFilePath("dynamic-types.yaml");
+ ErrorOr<std::unique_ptr<MemoryBuffer>> in_buffer =
+ llvm::MemoryBuffer::getFile(input_path, /*IsText=*/true);
+ if (std::error_code ec = in_buffer.getError())
+ return errorCodeToError(ec);
+
+ MinimalPdbYaml minimal_pdb;
+ yaml::Input yin(*in_buffer.get());
+ // FIXME: Remove this once we can build a PDB with ObjectYAML or similar.
+ yin.setAllowUnknownKeys(true);
+ yin >> minimal_pdb;
+ if (yin.error())
+ return errorCodeToError(yin.error());
+
+ BumpPtrAllocator allocator;
+ pdb::PDBFileBuilder builder(allocator);
+ Error err = builder.initialize(/*BlockSize=*/4096);
+ if (err)
+ return std::move(err);
+
+ for (uint32_t I = 0; I < pdb::kSpecialStreamCount; ++I) {
+ Expected<uint32_t> res = builder.getMsfBuilder().addStream(0);
+ if (!res)
+ return res.takeError();
+ }
+
+ pdb::InfoStreamBuilder &info = builder.getInfoBuilder();
+ info.setAge(1);
+ // GUID from dynamic-types-exe.yaml: {863E815D-0880-FDB2-4C4C-44205044422E}
+ info.setGuid({0x5D, 0x81, 0x3E, 0x86, 0x80, 0x08, 0xB2, 0xFD, 0x4C, 0x4C,
+ 0x44, 0x20, 0x50, 0x44, 0x42, 0x2E});
+ info.setSignature(0);
+ info.setVersion(pdb::PdbImplVC70);
+ info.addFeature(pdb::PdbRaw_FeatureSig::VC140);
+
+ pdb::TpiStreamBuilder &tpi = builder.getTpiBuilder();
+ codeview::AppendingTypeTableBuilder type_builder(allocator);
+ tpi.setVersionHeader(pdb::PdbTpiV80);
+ for (const auto &type : minimal_pdb.tpi.records) {
+ codeview::CVType Type = type.toCodeViewRecord(type_builder);
+ Expected<uint32_t> Hash = pdb::hashTypeRecord(Type);
+ if (!Hash)
+ return Hash.takeError();
+ tpi.addTypeRecord(Type.RecordData, *Hash);
+ }
+
+ pdb::TpiStreamBuilder &ipi = builder.getIpiBuilder();
+ ipi.setVersionHeader(pdb::PdbTpiV80);
+
+ pdb::GSIStreamBuilder &gsi = builder.getGsiBuilder();
+ // Add a fake public symbol to make sure the PDB has a publics stream.
+ std::vector<pdb::BulkPublic> publics{pdb::BulkPublic()};
+ gsi.addPublicSymbols(std::move(publics));
+
+ pdb::DbiStreamBuilder &dbi = builder.getDbiBuilder();
+ dbi.setAge(1);
+ dbi.setBuildNumber(0);
+ dbi.setFlags(1);
+ dbi.setMachineType(pdb::PDB_Machine::Amd64);
+ dbi.setPdbDllRbld(0);
+ dbi.setPdbDllVersion(0);
+ dbi.setVersionHeader(pdb::PdbDbiV70);
+
+ ArrayRef<object::coff_section> coff_sections(g_fixed_coff_sections);
+ dbi.createSectionMap(coff_sections);
+ err = dbi.addDbgStream(
+ pdb::DbgHeaderType::SectionHdr,
+ ArrayRef<uint8_t>{(const uint8_t *)coff_sections.data(),
+ coff_sections.size() * sizeof(object::coff_section)});
+ if (err)
+ return std::move(err);
+
+ std::string output_path = GetInputFilePath("dynamic-types.pdb");
+ GUID out_guid;
+ err = builder.commit(output_path, &out_guid);
+ if (err)
+ return std::move(err);
+ return output_path;
+}
+
+static Expected<std::string> createExe() {
+ std::string input_path = GetInputFilePath("dynamic-types-exe.yaml");
+ ErrorOr<std::unique_ptr<MemoryBuffer>> in_buffer =
+ llvm::MemoryBuffer::getFile(input_path, /*IsText=*/true);
+ if (std::error_code ec = in_buffer.getError())
+ return errorCodeToError(ec);
+
+ COFFYAML::Object obj;
+ yaml::Input yin(*in_buffer.get());
+ yin >> obj;
+ if (yin.error())
+ return errorCodeToError(yin.error());
+
+ std::string output_path = GetInputFilePath("dynamic-types.exe");
+ std::error_code ec;
+ raw_fd_ostream os(output_path, ec);
+ if (ec)
+ return errorCodeToError(ec);
+ std::string err;
+ bool ok = yaml::yaml2coff(obj, os,
+ [&](const Twine &msg) { err.append(msg.str()); });
+ if (!ok)
+ return createStringError(err);
+ return output_path;
+}
class SymbolFilePDBTests : public testing::Test {
public:
void SetUp() override {
- m_test_exe = GetInputFilePath("DynamicTypes.exe");
-
ArchSpec arch("x86_64-pc-windows-msvc");
Platform::SetHostPlatform(PlatformWindows::CreateInstance(true, &arch));
m_debugger_sp = Debugger::CreateInstance();
@@ -67,8 +256,6 @@ class SymbolFilePDBTests : public testing::Test {
}
protected:
- std::string m_test_exe;
-
SubsystemRAII<FileSystem, HostInfo, ObjectFilePECOFF, SymbolFileNativePDB,
SymbolFilePDB, TypeSystemClang>
m_subsystems;
@@ -76,7 +263,12 @@ class SymbolFilePDBTests : public testing::Test {
};
TEST_F(SymbolFilePDBTests, TestDynamicCxxType) {
- FileSpec fspec(m_test_exe);
+ Expected<std::string> pdb_path = createPdb();
+ EXPECT_THAT_EXPECTED(pdb_path, Succeeded());
+ Expected<std::string> exe_path = createExe();
+ EXPECT_THAT_EXPECTED(exe_path, Succeeded());
+
+ FileSpec fspec(*exe_path);
ArchSpec aspec("x86_64-pc-windows");
lldb::ModuleSP module = std::make_shared<Module>(fspec, aspec);
More information about the lldb-commits
mailing list