summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/Sparc/MappingInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/Sparc/MappingInfo.cpp')
-rw-r--r--llvm/lib/Target/Sparc/MappingInfo.cpp299
1 files changed, 0 insertions, 299 deletions
diff --git a/llvm/lib/Target/Sparc/MappingInfo.cpp b/llvm/lib/Target/Sparc/MappingInfo.cpp
deleted file mode 100644
index 4648c54e48e..00000000000
--- a/llvm/lib/Target/Sparc/MappingInfo.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-//===- MappingInfo.cpp - create LLVM info and output to .s file ---------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// This file contains a FunctionPass called MappingInfoAsmPrinter,
-// which creates two maps: one between LLVM Instructions and MachineInstrs
-// (the "LLVM I TO MI MAP"), and another between MachineBasicBlocks and
-// MachineInstrs (the "BB TO MI MAP").
-//
-// As a side effect, it outputs this information as .byte directives to
-// the assembly file. The output is designed to survive the SPARC assembler,
-// in order that the Reoptimizer may read it in from memory later when the
-// binary is loaded. Therefore, it may contain some hidden SPARC-architecture
-// dependencies. Currently this question is purely theoretical as the
-// Reoptimizer works only on the SPARC.
-//
-// The LLVM I TO MI MAP consists of a set of information for each
-// BasicBlock in a Function, ordered from begin() to end(). The information
-// for a BasicBlock consists of
-// 1) its (0-based) index in the Function,
-// 2) the number of LLVM Instructions it contains, and
-// 3) information for each Instruction, in sequence from the begin()
-// to the end() of the BasicBlock. The information for an Instruction
-// consists of
-// 1) its (0-based) index in the BasicBlock,
-// 2) the number of MachineInstrs that correspond to that Instruction
-// (as reported by MachineCodeForInstruction), and
-// 3) the MachineInstr number calculated by create_MI_to_number_Key,
-// for each of the MachineInstrs that correspond to that Instruction.
-//
-// The BB TO MI MAP consists of a three-element tuple for each
-// MachineBasicBlock in a function, ordered from begin() to end() of
-// its MachineFunction: first, the index of the MachineBasicBlock in the
-// function; second, the number of the MachineBasicBlock in the function
-// as computed by create_BB_to_MInumber_Key; and third, the number of
-// MachineInstrs in the MachineBasicBlock.
-//
-//===--------------------------------------------------------------------===//
-
-#include "MappingInfo.h"
-#include "llvm/Pass.h"
-#include "llvm/Module.h"
-#include "llvm/CodeGen/MachineFunction.h"
-#include "llvm/CodeGen/MachineCodeForInstruction.h"
-#include "Support/StringExtras.h"
-
-namespace llvm {
-
-namespace {
- class MappingInfoAsmPrinter : public FunctionPass {
- std::ostream &Out;
- public:
- MappingInfoAsmPrinter(std::ostream &out) : Out(out){}
- const char *getPassName () const { return "Instr. Mapping Info Collector"; }
- bool runOnFunction(Function &FI);
- typedef std::map<const MachineInstr*, unsigned> InstructionKey;
- private:
- MappingInfo *currentOutputMap;
- std::map<Function *, unsigned> Fkey; // Function # for all functions.
- bool doInitialization(Module &M);
- void create_BB_to_MInumber_Key(Function &FI, InstructionKey &key);
- void create_MI_to_number_Key(Function &FI, InstructionKey &key);
- void buildBBMIMap (Function &FI, MappingInfo &Map);
- void buildLMIMap (Function &FI, MappingInfo &Map);
- void writeNumber(unsigned X);
- void selectOutputMap (MappingInfo &m) { currentOutputMap = &m; }
- void outByte (unsigned char b) { currentOutputMap->outByte (b); }
- bool doFinalization (Module &M);
- };
-}
-
-/// getMappingInfoAsmPrinterPass - Static factory method: returns a new
-/// MappingInfoAsmPrinter Pass object, which uses OUT as its output
-/// stream for assembly output.
-///
-Pass *getMappingInfoAsmPrinterPass(std::ostream &out){
- return (new MappingInfoAsmPrinter(out));
-}
-
-/// runOnFunction - Builds up the maps for the given function FI and then
-/// writes them out as assembly code to the current output stream OUT.
-/// This is an entry point to the pass, called by the PassManager.
-///
-bool MappingInfoAsmPrinter::runOnFunction(Function &FI) {
- unsigned num = Fkey[&FI]; // Function number for the current function.
-
- // Create objects to hold the maps.
- MappingInfo LMIMap ("LLVM I TO MI MAP", "LMIMap", num);
- MappingInfo BBMIMap ("BB TO MI MAP", "BBMIMap", num);
-
- // Now, build the maps.
- buildLMIMap (FI, LMIMap);
- buildBBMIMap (FI, BBMIMap);
-
- // Now, write out the maps.
- LMIMap.dumpAssembly (Out);
- BBMIMap.dumpAssembly (Out);
-
- return false;
-}
-
-/// writeNumber - Write out the number X as a sequence of .byte
-/// directives to the current output stream Out. This method performs a
-/// run-length encoding of the unsigned integers X that are output.
-///
-void MappingInfoAsmPrinter::writeNumber(unsigned X) {
- unsigned i=0;
- do {
- unsigned tmp = X & 127;
- X >>= 7;
- if (X) tmp |= 128;
- outByte (tmp);
- ++i;
- } while(X);
-}
-
-/// doInitialization - Assign a number to each Function, as follows:
-/// Functions are numbered starting at 0 at the begin() of each Module.
-/// Functions which are External (and thus have 0 basic blocks) are not
-/// inserted into the maps, and are not assigned a number. The side-effect
-/// of this method is to fill in Fkey to contain the mapping from Functions
-/// to numbers. (This method is called automatically by the PassManager.)
-///
-bool MappingInfoAsmPrinter::doInitialization(Module &M) {
- unsigned i = 0;
- for (Module::iterator FI = M.begin(), FE = M.end(); FI != FE; ++FI) {
- if (FI->isExternal()) continue;
- Fkey[FI] = i;
- ++i;
- }
- return false; // Success.
-}
-
-/// create_BB_to_MInumber_Key -- Assign a number to each MachineBasicBlock
-/// in the given Function, as follows: Numbering starts at zero in each
-/// Function. MachineBasicBlocks are numbered from begin() to end()
-/// in the Function's corresponding MachineFunction. Each successive
-/// MachineBasicBlock increments the numbering by the number of instructions
-/// it contains. The side-effect of this method is to fill in the parameter
-/// KEY with the mapping of MachineBasicBlocks to numbers. KEY
-/// is keyed on MachineInstrs, so each MachineBasicBlock is represented
-/// therein by its first MachineInstr.
-///
-void MappingInfoAsmPrinter::create_BB_to_MInumber_Key(Function &FI,
- InstructionKey &key) {
- unsigned i = 0;
- MachineFunction &MF = MachineFunction::get(&FI);
- for (MachineFunction::iterator BI = MF.begin(), BE = MF.end();
- BI != BE; ++BI) {
- MachineBasicBlock &miBB = *BI;
- key[&miBB.front()] = i;
- i = i+(miBB.size());
- }
-}
-
-/// create_MI_to_number_Key - Assign a number to each MachineInstr
-/// in the given Function with respect to its enclosing MachineBasicBlock, as
-/// follows: Numberings start at 0 in each MachineBasicBlock. MachineInstrs
-/// are numbered from begin() to end() in their MachineBasicBlock. Each
-/// MachineInstr is numbered, then the numbering is incremented by 1. The
-/// side-effect of this method is to fill in the parameter KEY
-/// with the mapping from MachineInstrs to numbers.
-///
-void MappingInfoAsmPrinter::create_MI_to_number_Key(Function &FI,
- InstructionKey &key) {
- MachineFunction &MF = MachineFunction::get(&FI);
- for (MachineFunction::iterator BI=MF.begin(), BE=MF.end(); BI != BE; ++BI) {
- MachineBasicBlock &miBB = *BI;
- unsigned j = 0;
- for(MachineBasicBlock::iterator miI = miBB.begin(), miE = miBB.end();
- miI != miE; ++miI, ++j) {
- key[miI] = j;
- }
- }
-}
-
-/// buildBBMIMap - Build the BB TO MI MAP for the function FI,
-/// and save it into the parameter MAP.
-///
-void MappingInfoAsmPrinter::buildBBMIMap(Function &FI, MappingInfo &Map) {
- unsigned bb = 0;
-
- // First build temporary table used to write out the map.
- InstructionKey BBkey;
- create_BB_to_MInumber_Key(FI, BBkey);
-
- selectOutputMap (Map);
- MachineFunction &MF = MachineFunction::get(&FI);
- for (MachineFunction::iterator BI = MF.begin(), BE = MF.end();
- BI != BE; ++BI, ++bb) {
- MachineBasicBlock &miBB = *BI;
- writeNumber(bb);
- writeNumber(BBkey[&miBB.front()]);
- writeNumber(miBB.size());
- }
-}
-
-/// buildLMIMap - Build the LLVM I TO MI MAP for the function FI,
-/// and save it into the parameter MAP.
-///
-void MappingInfoAsmPrinter::buildLMIMap(Function &FI, MappingInfo &Map) {
- unsigned bb = 0;
- // First build temporary table used to write out the map.
- InstructionKey MIkey;
- create_MI_to_number_Key(FI, MIkey);
-
- selectOutputMap (Map);
- for (Function::iterator BI = FI.begin(), BE = FI.end();
- BI != BE; ++BI, ++bb) {
- unsigned li = 0;
- writeNumber(bb);
- writeNumber(BI->size());
- for (BasicBlock::iterator II = BI->begin(), IE = BI->end(); II != IE;
- ++II, ++li) {
- MachineCodeForInstruction& miI = MachineCodeForInstruction::get(II);
- writeNumber(li);
- writeNumber(miI.size());
- for (MachineCodeForInstruction::iterator miII = miI.begin(),
- miIE = miI.end(); miII != miIE; ++miII) {
- writeNumber(MIkey[*miII]);
- }
- }
- }
-}
-
-void MappingInfo::byteVector::dumpAssembly (std::ostream &Out) {
- for (iterator i = begin (), e = end (); i != e; ++i)
- Out << ".byte " << (int)*i << "\n";
-}
-
-static void writePrologue (std::ostream &Out, const std::string &comment,
- const std::string &symName) {
- // Prologue:
- // Output a comment describing the object.
- Out << "!" << comment << "\n";
- // Switch the current section to .rodata in the assembly output:
- Out << "\t.section \".rodata\"\n\t.align 8\n";
- // Output a global symbol naming the object:
- Out << "\t.global " << symName << "\n";
- Out << "\t.type " << symName << ",#object\n";
- Out << symName << ":\n";
-}
-
-static void writeEpilogue (std::ostream &Out, const std::string &symName) {
- // Epilogue:
- // Output a local symbol marking the end of the object:
- Out << ".end_" << symName << ":\n";
- // Output size directive giving the size of the object:
- Out << "\t.size " << symName << ", .end_" << symName << "-" << symName
- << "\n";
-}
-
-void MappingInfo::dumpAssembly (std::ostream &Out) {
- const std::string &name (symbolPrefix + utostr (functionNumber));
- writePrologue (Out, comment, name);
- // The LMIMap and BBMIMap are supposed to start with a length word:
- Out << "\t.word .end_" << name << "-" << name << "\n";
- bytes.dumpAssembly (Out);
- writeEpilogue (Out, name);
-}
-
-/// doFinalization - This method writes out two tables, named
-/// FunctionBB and FunctionLI, which map Function numbers (as in
-/// doInitialization) to the BBMIMap and LMIMap tables. (This used to
-/// be the "FunctionInfo" pass.)
-///
-bool MappingInfoAsmPrinter::doFinalization (Module &M) {
- unsigned f;
-
- writePrologue(Out, "FUNCTION TO BB MAP", "FunctionBB");
- f=0;
- for(Module::iterator FI = M.begin (), FE = M.end (); FE != FI; ++FI) {
- if (FI->isExternal ())
- continue;
- Out << "\t.xword BBMIMap" << f << "\n";
- ++f;
- }
- writeEpilogue(Out, "FunctionBB");
-
- writePrologue(Out, "FUNCTION TO LI MAP", "FunctionLI");
- f=0;
- for(Module::iterator FI = M.begin (), FE = M.end (); FE != FI; ++FI) {
- if (FI->isExternal ())
- continue;
- Out << "\t.xword LMIMap" << f << "\n";
- ++f;
- }
- writeEpilogue(Out, "FunctionLI");
-
- return false;
-}
-
-} // End llvm namespace
-
OpenPOWER on IntegriCloud