Skip to content

Commit c21b1be

Browse files
committed
Add structure types to the Yk IR.
(and also the `insertvalue` opcode to allow for testing in `yk`)
1 parent 82b2e13 commit c21b1be

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

llvm/lib/YkIR/YkIRWriter.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ enum OpCode {
4545
ICmp,
4646
BinaryOperator,
4747
Ret,
48+
InsertValue,
4849
UnimplementedInstruction = 255, // YKFIXME: Will eventually be deleted.
4950
};
5051

@@ -63,6 +64,7 @@ enum TypeKind {
6364
Integer,
6465
Ptr,
6566
FunctionTy,
67+
Struct,
6668
UnimplementedType = 255, // YKFIXME: Will eventually be deleted.
6769
};
6870

@@ -350,6 +352,7 @@ class YkIRWriter {
350352
GENERIC_INST_SERIALISE(I, ICmpInst, ICmp)
351353
GENERIC_INST_SERIALISE(I, llvm::BinaryOperator, BinaryOperator)
352354
GENERIC_INST_SERIALISE(I, ReturnInst, Ret)
355+
GENERIC_INST_SERIALISE(I, llvm::InsertValueInst, InsertValue)
353356

354357
CUSTOM_INST_SERIALISE(I, AllocaInst, serialiseAllocaInst)
355358
CUSTOM_INST_SERIALISE(I, CallInst, serialiseCallInst)
@@ -426,6 +429,23 @@ class YkIRWriter {
426429
OutStreamer.emitInt8(Ty->isVarArg());
427430
}
428431

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+
429449
void serialiseType(llvm::Type *Ty) {
430450
if (Ty->isVoidTy()) {
431451
OutStreamer.emitInt8(TypeKind::Void);
@@ -436,6 +456,8 @@ class YkIRWriter {
436456
OutStreamer.emitInt32(ITy->getBitWidth());
437457
} else if (FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
438458
serialiseFunctionType(FTy);
459+
} else if (StructType *STy = dyn_cast<StructType>(Ty)) {
460+
serialiseStructType(STy);
439461
} else {
440462
OutStreamer.emitInt8(TypeKind::UnimplementedType);
441463
serialiseString(toString(Ty));

0 commit comments

Comments
 (0)