15#define DEBUG_TYPE "dataflow"
22 assert(Field.getType()->isReferenceType() ||
23 (SrcFieldLoc !=
nullptr && DstFieldLoc !=
nullptr));
25 if (Field.getType()->isRecordType()) {
26 copyRecord(cast<RecordStorageLocation>(*SrcFieldLoc),
27 cast<RecordStorageLocation>(*DstFieldLoc),
Env);
28 }
else if (Field.getType()->isReferenceType()) {
41 copyRecord(cast<RecordStorageLocation>(SrcFieldLoc),
42 cast<RecordStorageLocation>(DstFieldLoc),
Env);
57 auto DstDecl = DstType->getAsCXXRecordDecl();
59 [[maybe_unused]]
bool compatibleTypes =
61 (SrcDecl !=
nullptr && DstDecl !=
nullptr &&
62 (SrcDecl->isDerivedFrom(DstDecl) || DstDecl->isDerivedFrom(SrcDecl)));
65 if (!compatibleTypes) {
66 llvm::dbgs() <<
"Source type " << Src.
getType() <<
"\n";
67 llvm::dbgs() <<
"Destination type " << Dst.
getType() <<
"\n";
70 assert(compatibleTypes);
72 if (SrcType == DstType || (SrcDecl !=
nullptr && DstDecl !=
nullptr &&
73 SrcDecl->isDerivedFrom(DstDecl))) {
74 for (
auto [Field, DstFieldLoc] : Dst.
children())
80 for (
auto [Field, SrcFieldLoc] : Src.
children())
93 llvm::dbgs() <<
"Loc1 type " << Loc1.getType() <<
"\n";
94 llvm::dbgs() <<
"Loc2 type " << Loc2.getType() <<
"\n";
100 for (
auto [Field, FieldLoc1] : Loc1.
children()) {
103 assert(Field->getType()->isReferenceType() ||
104 (FieldLoc1 !=
nullptr && FieldLoc2 !=
nullptr));
106 if (Field->getType()->isRecordType()) {
107 if (!
recordsEqual(cast<RecordStorageLocation>(*FieldLoc1), Env1,
108 cast<RecordStorageLocation>(*FieldLoc2), Env2))
110 }
else if (Field->getType()->isReferenceType()) {
111 if (FieldLoc1 != FieldLoc2)
119 if (SynthFieldLoc1->getType()->isRecordType()) {
121 *cast<RecordStorageLocation>(SynthFieldLoc1), Env1,
124 }
else if (Env1.
getValue(*SynthFieldLoc1) !=