@@ -45,6 +45,7 @@ enum OpCode {
45
45
ICmp,
46
46
BinaryOperator,
47
47
Ret,
48
+ InsertValue,
48
49
UnimplementedInstruction = 255 , // YKFIXME: Will eventually be deleted.
49
50
};
50
51
@@ -63,6 +64,7 @@ enum TypeKind {
63
64
Integer,
64
65
Ptr,
65
66
FunctionTy,
67
+ Struct,
66
68
UnimplementedType = 255 , // YKFIXME: Will eventually be deleted.
67
69
};
68
70
@@ -350,6 +352,7 @@ class YkIRWriter {
350
352
GENERIC_INST_SERIALISE (I, ICmpInst, ICmp)
351
353
GENERIC_INST_SERIALISE (I, llvm::BinaryOperator, BinaryOperator)
352
354
GENERIC_INST_SERIALISE (I, ReturnInst, Ret)
355
+ GENERIC_INST_SERIALISE (I, llvm::InsertValueInst, InsertValue)
353
356
354
357
CUSTOM_INST_SERIALISE (I, AllocaInst, serialiseAllocaInst)
355
358
CUSTOM_INST_SERIALISE (I, CallInst, serialiseCallInst)
@@ -426,6 +429,23 @@ class YkIRWriter {
426
429
OutStreamer.emitInt8 (Ty->isVarArg ());
427
430
}
428
431
432
+ void serialiseStructType (StructType *STy) {
433
+ OutStreamer.emitInt8 (TypeKind::Struct);
434
+ unsigned NumFields = STy->getNumElements ();
435
+ DataLayout DL (&M);
436
+ const StructLayout *SL = DL.getStructLayout (STy);
437
+ // num_fields:
438
+ OutStreamer.emitSizeT (NumFields);
439
+ // field_tys:
440
+ for (unsigned I = 0 ; I < NumFields; I++) {
441
+ OutStreamer.emitSizeT (typeIndex (STy->getElementType (I)));
442
+ }
443
+ // field_bit_offs:
444
+ for (unsigned I = 0 ; I < NumFields; I++) {
445
+ OutStreamer.emitSizeT (SL->getElementOffsetInBits (I));
446
+ }
447
+ }
448
+
429
449
void serialiseType (llvm::Type *Ty) {
430
450
if (Ty->isVoidTy ()) {
431
451
OutStreamer.emitInt8 (TypeKind::Void);
@@ -436,6 +456,8 @@ class YkIRWriter {
436
456
OutStreamer.emitInt32 (ITy->getBitWidth ());
437
457
} else if (FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
438
458
serialiseFunctionType (FTy);
459
+ } else if (StructType *STy = dyn_cast<StructType>(Ty)) {
460
+ serialiseStructType (STy);
439
461
} else {
440
462
OutStreamer.emitInt8 (TypeKind::UnimplementedType);
441
463
serialiseString (toString (Ty));
0 commit comments