# The idea is to set up some types in the TPI stream, and then have records in
# the IPI stream that refer to them. There are three types of IPI records that
# can refer to TPI records. They are:
# 1) LF_PROCEDURE - Referred to by LF_FUNC_ID
# 2) LF_STRUCTURE - Referred to by LF_UDT_MOD_SRC_LINE
# Referred to by LF_UDT_SRC_LINE
# 3) LF_MFUNCTION - Referred to by LF_MFUNC_ID
# We will set up one of each of these, and then create IPI records that refer to
# them. We intentionally choose an unintuitive ordering of the records in both
# streams (while still maintaining the topological sorting required by CodeView
# type streams), to make sure the merging algorithm is sufficiently exercised.
# For easy understanding, a semantic representation of the types we will set up
# is as follows:
# - int main(int, char**)
#
# - struct FooBar {
# public:
# void *FooMember;
# void FooMethod(int);
# };
TpiStream:
Records:
# TypeIndex: 4096 (0x1000)
# char**
- Kind: LF_POINTER
Pointer:
ReferentType: 1136
Attrs: 32778
# TypeIndex: 4097 (0x1001)
# public void *FooMember
- Kind: LF_FIELDLIST
FieldList:
- Kind: LF_MEMBER
DataMember:
Attrs: 3 # public
Type: 1027 # void*
FieldOffset: 0
Name: FooMember # FooMember
# TypeIndex: 4098 (0x1002)
# (int, char**)
- Kind: LF_ARGLIST
ArgList:
ArgIndices: [ 116, 4096 ]
# TypeIndex: 4099 (0x1003)
# struct FooBar {
# public:
# void *FooMember;
# };
- Kind: LF_STRUCTURE
Class:
MemberCount: 1
Options: [ None, HasUniqueName ]
FieldList: 4097
Name: FooBar
UniqueName: 'FooBar'
DerivationList: 0
VTableShape: 0
Size: 4
# TypeIndex: 4100 (0x1004)
# FooBar *
- Kind: LF_POINTER
Pointer:
ReferentType: 4099 # FooBar
Attrs: 32778
# TypeIndex: 4101 (0x1005)
# (int)
- Kind: LF_ARGLIST
ArgList:
ArgIndices: [ 116 ]
# TypeIndex: 4102 (0x1006)
- Kind: LF_MFUNCTION
MemberFunction:
ReturnType: 3 # void
ClassType: 4099 # struct FooBar
ThisType: 4100 # FooBar *
CallConv: ThisCall
Options: [ None, Constructor ]
ParameterCount: 1
ArgumentList: 4101 # (int)
ThisPointerAdjustment: 0
# TypeIndex: 4103 (0x1007)
# int (int, char**)
- Kind: LF_PROCEDURE
Procedure:
ReturnType: 116 # int
CallConv: NearC
Options: [ None ]
ParameterCount: 2
ArgumentList: 4098 # (int, char**)
IpiStream:
Records:
# TypeIndex: 4096 (0x1000)
# int main(int, char **)
- Kind: LF_FUNC_ID
FuncId:
ParentScope: 0
FunctionType: 4103 # int main(int, char**)
Name: main
# TypeIndex: 4097 (0x1001)
# void FooBar::FooMethod(int)
- Kind: LF_MFUNC_ID
MemberFuncId:
ClassType: 4099 # struct FooBar
FunctionType: 4102 # void FooMethod(int)
Name: FooMethod
# TypeIndex: 4098 (0x1002)
# struct FooBar
- Kind: LF_UDT_MOD_SRC_LINE
UdtModSourceLine:
UDT: 4099 # struct FooBar
SourceFile: 0 # We don't support this yet
LineNumber: 0
Module: 0 # We don't support this yet