@@ -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)
@@ -365,6 +368,8 @@ class YkIRWriter {
365
368
void serialiseUnimplementedInstruction (Instruction *I,
366
369
ValueLoweringMap &VLMap,
367
370
unsigned BBIdx, unsigned &InstIdx) {
371
+ // type_index:
372
+ OutStreamer.emitSizeT (typeIndex (I->getType ()));
368
373
// opcode:
369
374
serialiseOpcode (UnimplementedInstruction);
370
375
// num_operands:
@@ -424,6 +429,23 @@ class YkIRWriter {
424
429
OutStreamer.emitInt8 (Ty->isVarArg ());
425
430
}
426
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
+
427
449
void serialiseType (llvm::Type *Ty) {
428
450
if (Ty->isVoidTy ()) {
429
451
OutStreamer.emitInt8 (TypeKind::Void);
@@ -434,6 +456,8 @@ class YkIRWriter {
434
456
OutStreamer.emitInt32 (ITy->getBitWidth ());
435
457
} else if (FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
436
458
serialiseFunctionType (FTy);
459
+ } else if (StructType *STy = dyn_cast<StructType>(Ty)) {
460
+ serialiseStructType (STy);
437
461
} else {
438
462
OutStreamer.emitInt8 (TypeKind::UnimplementedType);
439
463
serialiseString (toString (Ty));
0 commit comments