diff --git a/src/common/instruction.h b/src/common/instruction.h index 9d8fccc..06db49b 100644 --- a/src/common/instruction.h +++ b/src/common/instruction.h @@ -30,6 +30,9 @@ class Instruction { // raw representation of instruction std::string raw; + const std::unordered_map operation_map{ + {"add", ADD}, {"sub", SUB}, {"mul", MUL}, {"shl", SHL}, }; + // Default constructor Instruction() {} @@ -67,9 +70,7 @@ class Instruction { } else if (contents[2] == "add" || contents[2] == "sub" || contents[2] == "mul" || contents[2] == "shl") { destination = contents[0]; - oper = (contents[2] == "add") ? ADD : - (oper = (contents[2] == "sub") ? SUB : - (oper = (contents[2] == "mul") ? MUL : SHL)); + oper = operation_map.at(contents[2]); // = add nuw nsw , ; yields {ty}:result if (contents[3] == "nuw" && contents[4] == "nsw") { type = contents[5]; @@ -96,7 +97,7 @@ class Instruction { oper = BITCAST; operand1 = contents[4]; operand2 = contents[4]; - } else if (contents[0] == "call") { + } else if (contents[0] == "call" || contents[2] == "call") { oper = CALL; } diff --git a/test/Common_Instruction_gtest.cc b/test/Common_Instruction_gtest.cc index 8760329..14b48a2 100644 --- a/test/Common_Instruction_gtest.cc +++ b/test/Common_Instruction_gtest.cc @@ -53,3 +53,18 @@ TEST(InstructionTests, CheckInstructionForAlloca) { EXPECT_EQ("%balance", instr.destination); EXPECT_EQ("i32", instr.type); } + +TEST(InstructionTests, CheckInstructionForBitcast) { + std::string raw_instruction("%1 = bitcast %struct.Foo* %my_struct to void (%struct. Foo*)***"); + Instruction instr(raw_instruction); + EXPECT_EQ(BITCAST, instr.oper); + EXPECT_EQ("%1", instr.destination); + EXPECT_EQ("%my_struct", instr.operand1); + EXPECT_EQ("%my_struct", instr.operand2); +} + +TEST(InstructionTests, CheckInstructionForCall) { + std::string raw_instruction("%x = call i32 @someFunction()"); + Instruction instr(raw_instruction); + EXPECT_EQ(CALL, instr.oper); +}