//===-- MSP430BranchSelector.cpp - Emit long conditional branches ---------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains a pass that scans a machine function to determine which // conditional branches need more than 10 bits of displacement to reach their // target basic block. It does this in two passes; a calculation of basic block // positions pass, and a branch pseudo op to machine branch opcode pass. This // pass should be run last, just before the assembly printer. // //===----------------------------------------------------------------------===// #include "MSP430.h" #include "MSP430InstrInfo.h" #include "MSP430Subtarget.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/Support/Debug.h" #include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetMachine.h" usingnamespacellvm; #define DEBUG_TYPE … static cl::opt<bool> BranchSelectEnabled("msp430-branch-select", cl::Hidden, cl::init(true), cl::desc("Expand out of range branches")); STATISTIC(NumSplit, "Number of machine basic blocks split"); STATISTIC(NumExpanded, "Number of branches expanded to long format"); namespace { class MSP430BSel : public MachineFunctionPass { … }; char MSP430BSel::ID = …; } static bool isInRage(int DistanceInBytes) { … } /// Measure each basic block, fill the BlockOffsets, and return the size of /// the function, starting with BB unsigned MSP430BSel::measureFunction(OffsetVector &BlockOffsets, MachineBasicBlock *FromBB) { … } /// Do expand branches and split the basic blocks if necessary. /// Returns true if made any change. bool MSP430BSel::expandBranches(OffsetVector &BlockOffsets) { … } bool MSP430BSel::runOnMachineFunction(MachineFunction &mf) { … } /// Returns an instance of the Branch Selection Pass FunctionPass *llvm::createMSP430BranchSelectionPass() { … }