1a23f9846SBjorn Pettersson //===- MachineBasicBlockTest.cpp ------------------------------------------===// 2a23f9846SBjorn Pettersson // 3a23f9846SBjorn Pettersson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a23f9846SBjorn Pettersson // See https://llvm.org/LICENSE.txt for license information. 5a23f9846SBjorn Pettersson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a23f9846SBjorn Pettersson // 7a23f9846SBjorn Pettersson //===----------------------------------------------------------------------===// 8a23f9846SBjorn Pettersson 9a23f9846SBjorn Pettersson #include "llvm/CodeGen/MachineBasicBlock.h" 10*bb3f5e1fSMatin Raayai #include "llvm/CodeGen/CodeGenTargetMachineImpl.h" 11a23f9846SBjorn Pettersson #include "llvm/CodeGen/MachineFunction.h" 12a23f9846SBjorn Pettersson #include "llvm/CodeGen/MachineInstr.h" 13a23f9846SBjorn Pettersson #include "llvm/CodeGen/MachineInstrBuilder.h" 14a23f9846SBjorn Pettersson #include "llvm/CodeGen/MachineModuleInfo.h" 15a23f9846SBjorn Pettersson #include "llvm/CodeGen/TargetFrameLowering.h" 16a23f9846SBjorn Pettersson #include "llvm/CodeGen/TargetInstrInfo.h" 17a23f9846SBjorn Pettersson #include "llvm/CodeGen/TargetLowering.h" 18a23f9846SBjorn Pettersson #include "llvm/CodeGen/TargetSubtargetInfo.h" 19a23f9846SBjorn Pettersson #include "llvm/IR/DIBuilder.h" 20a23f9846SBjorn Pettersson #include "llvm/IR/DebugInfoMetadata.h" 21a23f9846SBjorn Pettersson #include "llvm/IR/IRBuilder.h" 2274deadf1SNikita Popov #include "llvm/IR/Module.h" 23a23f9846SBjorn Pettersson #include "llvm/MC/TargetRegistry.h" 24a23f9846SBjorn Pettersson #include "gmock/gmock.h" 25a23f9846SBjorn Pettersson #include "gtest/gtest.h" 26a23f9846SBjorn Pettersson 27a23f9846SBjorn Pettersson using namespace llvm; 28a23f9846SBjorn Pettersson 29a23f9846SBjorn Pettersson namespace { 30a23f9846SBjorn Pettersson // Include helper functions to ease the manipulation of MachineFunctions. 31a23f9846SBjorn Pettersson #include "MFCommon.inc" 32a23f9846SBjorn Pettersson 33a23f9846SBjorn Pettersson TEST(FindDebugLocTest, DifferentIterators) { 34a23f9846SBjorn Pettersson LLVMContext Ctx; 35a23f9846SBjorn Pettersson Module Mod("Module", Ctx); 36a23f9846SBjorn Pettersson auto MF = createMachineFunction(Ctx, Mod); 37a23f9846SBjorn Pettersson auto &MBB = *MF->CreateMachineBasicBlock(); 38a23f9846SBjorn Pettersson 39a23f9846SBjorn Pettersson // Create metadata: CU, subprogram, some blocks and an inline function 40a23f9846SBjorn Pettersson // scope. 41a23f9846SBjorn Pettersson DIBuilder DIB(Mod); 42a23f9846SBjorn Pettersson DIFile *OurFile = DIB.createFile("foo.c", "/bar"); 43a23f9846SBjorn Pettersson DICompileUnit *OurCU = 44a23f9846SBjorn Pettersson DIB.createCompileUnit(dwarf::DW_LANG_C99, OurFile, "", false, "", 0); 45eb6e7e8fSJay Foad auto OurSubT = DIB.createSubroutineType(DIB.getOrCreateTypeArray({})); 46a23f9846SBjorn Pettersson DISubprogram *OurFunc = 47a23f9846SBjorn Pettersson DIB.createFunction(OurCU, "bees", "", OurFile, 1, OurSubT, 1, 48a23f9846SBjorn Pettersson DINode::FlagZero, DISubprogram::SPFlagDefinition); 49a23f9846SBjorn Pettersson 50a23f9846SBjorn Pettersson DebugLoc DL0; 51a23f9846SBjorn Pettersson DebugLoc DL1 = DILocation::get(Ctx, 1, 0, OurFunc); 52a23f9846SBjorn Pettersson DebugLoc DL2 = DILocation::get(Ctx, 2, 0, OurFunc); 53a23f9846SBjorn Pettersson DebugLoc DL3 = DILocation::get(Ctx, 3, 0, OurFunc); 54a23f9846SBjorn Pettersson 55a23f9846SBjorn Pettersson // Test using and empty MBB. 56a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.findDebugLoc(MBB.instr_begin())); 57a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.findDebugLoc(MBB.instr_end())); 58a23f9846SBjorn Pettersson 5963c9fe2dSBjorn Pettersson EXPECT_EQ(DL0, MBB.rfindDebugLoc(MBB.instr_rbegin())); 6063c9fe2dSBjorn Pettersson EXPECT_EQ(DL0, MBB.rfindDebugLoc(MBB.instr_rend())); 61a23f9846SBjorn Pettersson 62a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.findPrevDebugLoc(MBB.instr_begin())); 63a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.findPrevDebugLoc(MBB.instr_end())); 64a23f9846SBjorn Pettersson 65a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.rfindPrevDebugLoc(MBB.instr_rbegin())); 66a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.rfindPrevDebugLoc(MBB.instr_rend())); 67a23f9846SBjorn Pettersson 68a23f9846SBjorn Pettersson // Insert two MIs with DebugLoc DL1 and DL3. 69a23f9846SBjorn Pettersson // Also add a DBG_VALUE with a different DebugLoc in between. 70a23f9846SBjorn Pettersson MCInstrDesc COPY = {TargetOpcode::COPY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 71a23f9846SBjorn Pettersson MCInstrDesc DBG = {TargetOpcode::DBG_VALUE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 72a23f9846SBjorn Pettersson auto MI3 = MF->CreateMachineInstr(COPY, DL3); 73a23f9846SBjorn Pettersson MBB.insert(MBB.begin(), MI3); 74a23f9846SBjorn Pettersson auto MI2 = MF->CreateMachineInstr(DBG, DL2); 75a23f9846SBjorn Pettersson MBB.insert(MBB.begin(), MI2); 76a23f9846SBjorn Pettersson auto MI1 = MF->CreateMachineInstr(COPY, DL1); 77a23f9846SBjorn Pettersson MBB.insert(MBB.begin(), MI1); 78a23f9846SBjorn Pettersson 79a23f9846SBjorn Pettersson // Test using two MIs with a debug instruction in between. 80a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.findDebugLoc(MBB.instr_begin())); 81a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.findDebugLoc(MI1)); 82a23f9846SBjorn Pettersson EXPECT_EQ(DL3, MBB.findDebugLoc(MI2)); 83a23f9846SBjorn Pettersson EXPECT_EQ(DL3, MBB.findDebugLoc(MI3)); 84a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.findDebugLoc(MBB.instr_end())); 85a23f9846SBjorn Pettersson 8663c9fe2dSBjorn Pettersson EXPECT_EQ(DL1, MBB.rfindDebugLoc(MBB.instr_rend())); 87a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.rfindDebugLoc(MI1)); 88a23f9846SBjorn Pettersson EXPECT_EQ(DL3, MBB.rfindDebugLoc(MI2)); 89a23f9846SBjorn Pettersson EXPECT_EQ(DL3, MBB.rfindDebugLoc(MI3)); 90a23f9846SBjorn Pettersson EXPECT_EQ(DL3, MBB.rfindDebugLoc(MBB.instr_rbegin())); 91a23f9846SBjorn Pettersson 92a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.findPrevDebugLoc(MBB.instr_begin())); 93a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.findPrevDebugLoc(MI1)); 94a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.findPrevDebugLoc(MI2)); 95a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.findPrevDebugLoc(MI3)); 96a23f9846SBjorn Pettersson EXPECT_EQ(DL3, MBB.findPrevDebugLoc(MBB.instr_end())); 97a23f9846SBjorn Pettersson 98a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.rfindPrevDebugLoc(MBB.instr_rend())); 99a23f9846SBjorn Pettersson EXPECT_EQ(DL0, MBB.rfindPrevDebugLoc(MI1)); 100a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.rfindPrevDebugLoc(MI2)); 101a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.rfindPrevDebugLoc(MI3)); 102a23f9846SBjorn Pettersson EXPECT_EQ(DL1, MBB.rfindPrevDebugLoc(MBB.instr_rbegin())); 10328d418b1SBjorn Pettersson 10428d418b1SBjorn Pettersson // Finalize DIBuilder to avoid memory leaks. 10528d418b1SBjorn Pettersson DIB.finalize(); 106a23f9846SBjorn Pettersson } 107a23f9846SBjorn Pettersson 108a23f9846SBjorn Pettersson } // end namespace 109