From b43086b4b7a3e79f71fc19d150803ca3c912975c Mon Sep 17 00:00:00 2001 From: Mehwish Nagda Date: Mon, 15 Jul 2002 23:08:49 +0000 Subject: [PATCH] Initial checking : Writes LLVM - MI mappiing to the .s file git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2911 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/InstrSelection/MappingInfo.cpp | 247 ++++++++++++++++++ .../SparcV9/InstrSelection/MappingInfo.cpp | 247 ++++++++++++++++++ 2 files changed, 494 insertions(+) create mode 100644 lib/CodeGen/InstrSelection/MappingInfo.cpp create mode 100644 lib/Target/SparcV9/InstrSelection/MappingInfo.cpp diff --git a/lib/CodeGen/InstrSelection/MappingInfo.cpp b/lib/CodeGen/InstrSelection/MappingInfo.cpp new file mode 100644 index 00000000000..9bc5dd435b4 --- /dev/null +++ b/lib/CodeGen/InstrSelection/MappingInfo.cpp @@ -0,0 +1,247 @@ +//===- MappingInfo.cpp - create LLVM info and output to .s file ---------===// +// +// Create Map from LLVM BB and Instructions and Machine Instructions +// and output the information as .byte directives to the .s file +// +//===--------------------------------------------------------------------===// + +#include "llvm/CodeGen/MappingInfo.h" +#include "llvm/Pass.h" +#include "llvm/Module.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineCodeForBasicBlock.h" +#include "llvm/CodeGen/MachineCodeForInstruction.h" +#include +#include +#include +using std::vector; + + + +// MappingInfo - This method collects mapping info +// for the mapping from LLVM to machine code. +// +namespace { + class getMappingInfoForFunction : public Pass { + std::ostream &Out; + private: + std::map Fkey; //key of function to num + std::map BBkey; //key basic block to num + std::map MIkey; //key machine instruction to num + vector > BBmap; + vector > MImap; + + void createFunctionKey(Module *M); + void createBasicBlockKey(Module *M); + void createMachineInstructionKey(Module *M); + void createBBToMImap(Module *M); + void createLLVMToMImap(Module *M); + void writeNumber(int X); + + public: + getMappingInfoForFunction(std::ostream &out) : Out(out){} + + const char* getPassName() const { + return "Sparc CollectMappingInfoForInstruction"; + } + + bool run(Module &M); + }; +} + + +//pass definition +Pass *MappingInfoForFunction(std::ostream &out){ + return (new getMappingInfoForFunction(out)); +} + +//function definitions : +//create and output maps to the .s file +bool getMappingInfoForFunction::run(Module &m) { + Module *M = &m; + + //map for Function to Function number + createFunctionKey(M); + + //map for BB to LLVM instruction number + createBasicBlockKey(M); + + //map from Machine Instruction to Machine Instruction number + createMachineInstructionKey(M); + + //map of Basic Block to first Machine Instruction and number + // of instructions go thro each function + createBBToMImap(M); + + //map of LLVM Instruction to Machine Instruction + createLLVMToMImap(M); + + + // Write map to the sparc assembly stream + // Start by writing out the basic block to first and last + // machine instruction map to the .s file + Out << "\n\n!BB TO MI MAP\n"; + Out << "\t.section \".data\"\n\t.align 8\n"; + Out << "\t.global BBMIMap\n"; + Out << "BBMIMap:\n"; + //add stream object here that will contain info about the map + //add object to write this out to the .s file + for (vector >::iterator BBmapI = + BBmap.begin(), BBmapE = BBmap.end(); BBmapI != BBmapE; + ++BBmapI){ + writeNumber((*BBmapI)[0]); + writeNumber((*BBmapI)[1]); + writeNumber((*BBmapI)[2]); + writeNumber((*BBmapI)[3]); + } + + Out << "\t.type BBMIMap,#object\n"; + Out << "\t.size BBMIMap,"< >::iterator MImapI = + MImap.begin(), MImapE = MImap.end(); MImapI != MImapE; + ++MImapI){ + writeNumber((*MImapI)[0]); + writeNumber((*MImapI)[1]); + writeNumber((*MImapI)[2]); + writeNumber((*MImapI)[3]); + } + Out << "\t.type LMIMap,#object\n"; + Out << "\t.size LMIMap,"<>= 7; + if (X) tmp |= 128; + Out << "\t.byte " << tmp << "\n"; + } while(X); +} + +//Assign a number to each Function +void getMappingInfoForFunction::createFunctionKey(Module *M){ + int i = 0; + int j = 0; + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <=1) continue; + Fkey[FI] = i; + ++i; + } +} + +//Assign a Number to each BB +void getMappingInfoForFunction::createBasicBlockKey(Module *M){ + int i = 0; + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + // int i = 0; + if(FI->size() <= 1) continue; + for (Function::iterator BI = FI->begin(), BE = FI->end(); + BI != BE; ++BI){ + MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI); + BBkey[miBB[0]] = i; + i = i+(miBB.size()); + } + } +} + +void getMappingInfoForFunction::createMachineInstructionKey(Module *M){ + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <= 1) continue; + for (Function::iterator BI=FI->begin(), BE=FI->end(); + BI != BE; ++BI){ + MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI); + int j = 0; + for (MachineCodeForBasicBlock::iterator miI = miBB.begin(), + miE = miBB.end(); miI != miE; ++miI, ++j){ + MIkey[*miI] = j; + } + } + } +} + +void getMappingInfoForFunction::createBBToMImap(Module *M){ + //go thro each function in the module + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <= 1)continue; + //go thro each basic block in that function + int i = 0; + for (Function::iterator BI = FI->begin(), + BE = FI->end(); BI != BE; ++BI){ + //create a Map record + //get the corresponding machine instruction + MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI); + //add record into the map + BBmap.push_back(vector()); + vector &oneBB = BBmap.back(); + oneBB.reserve(4); + + //add the function number + oneBB.push_back(Fkey[FI]); + //add the machine instruction number + oneBB.push_back( i ); + oneBB.push_back( BBkey[ miBB[0] ]); + //add the number of instructions + oneBB.push_back(miBB.size()); + ++i; + + } + } +} + +void getMappingInfoForFunction::createLLVMToMImap(Module *M){ + + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <= 1) continue; + int i =0; + for (Function::iterator BI = FI->begin(), BE = FI->end(); + BI != BE; ++BI, ++i){ + int j = 0; + for (BasicBlock::iterator II = BI->begin(), + IE = BI->end(); II != IE; ++II, ++j){ + MachineCodeForInstruction& miI = + MachineCodeForInstruction::get(II); + for (MachineCodeForInstruction::iterator miII = miI.begin(), + miIE = miI.end(); miII != miIE; ++miII){ + + vector oneMI; + oneMI.push_back(Fkey[FI]); + oneMI.push_back(i); + oneMI.push_back(j); + oneMI.push_back(MIkey[*miII]); + MImap.push_back(oneMI); + } + } + } + } +} + + diff --git a/lib/Target/SparcV9/InstrSelection/MappingInfo.cpp b/lib/Target/SparcV9/InstrSelection/MappingInfo.cpp new file mode 100644 index 00000000000..9bc5dd435b4 --- /dev/null +++ b/lib/Target/SparcV9/InstrSelection/MappingInfo.cpp @@ -0,0 +1,247 @@ +//===- MappingInfo.cpp - create LLVM info and output to .s file ---------===// +// +// Create Map from LLVM BB and Instructions and Machine Instructions +// and output the information as .byte directives to the .s file +// +//===--------------------------------------------------------------------===// + +#include "llvm/CodeGen/MappingInfo.h" +#include "llvm/Pass.h" +#include "llvm/Module.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineCodeForBasicBlock.h" +#include "llvm/CodeGen/MachineCodeForInstruction.h" +#include +#include +#include +using std::vector; + + + +// MappingInfo - This method collects mapping info +// for the mapping from LLVM to machine code. +// +namespace { + class getMappingInfoForFunction : public Pass { + std::ostream &Out; + private: + std::map Fkey; //key of function to num + std::map BBkey; //key basic block to num + std::map MIkey; //key machine instruction to num + vector > BBmap; + vector > MImap; + + void createFunctionKey(Module *M); + void createBasicBlockKey(Module *M); + void createMachineInstructionKey(Module *M); + void createBBToMImap(Module *M); + void createLLVMToMImap(Module *M); + void writeNumber(int X); + + public: + getMappingInfoForFunction(std::ostream &out) : Out(out){} + + const char* getPassName() const { + return "Sparc CollectMappingInfoForInstruction"; + } + + bool run(Module &M); + }; +} + + +//pass definition +Pass *MappingInfoForFunction(std::ostream &out){ + return (new getMappingInfoForFunction(out)); +} + +//function definitions : +//create and output maps to the .s file +bool getMappingInfoForFunction::run(Module &m) { + Module *M = &m; + + //map for Function to Function number + createFunctionKey(M); + + //map for BB to LLVM instruction number + createBasicBlockKey(M); + + //map from Machine Instruction to Machine Instruction number + createMachineInstructionKey(M); + + //map of Basic Block to first Machine Instruction and number + // of instructions go thro each function + createBBToMImap(M); + + //map of LLVM Instruction to Machine Instruction + createLLVMToMImap(M); + + + // Write map to the sparc assembly stream + // Start by writing out the basic block to first and last + // machine instruction map to the .s file + Out << "\n\n!BB TO MI MAP\n"; + Out << "\t.section \".data\"\n\t.align 8\n"; + Out << "\t.global BBMIMap\n"; + Out << "BBMIMap:\n"; + //add stream object here that will contain info about the map + //add object to write this out to the .s file + for (vector >::iterator BBmapI = + BBmap.begin(), BBmapE = BBmap.end(); BBmapI != BBmapE; + ++BBmapI){ + writeNumber((*BBmapI)[0]); + writeNumber((*BBmapI)[1]); + writeNumber((*BBmapI)[2]); + writeNumber((*BBmapI)[3]); + } + + Out << "\t.type BBMIMap,#object\n"; + Out << "\t.size BBMIMap,"< >::iterator MImapI = + MImap.begin(), MImapE = MImap.end(); MImapI != MImapE; + ++MImapI){ + writeNumber((*MImapI)[0]); + writeNumber((*MImapI)[1]); + writeNumber((*MImapI)[2]); + writeNumber((*MImapI)[3]); + } + Out << "\t.type LMIMap,#object\n"; + Out << "\t.size LMIMap,"<>= 7; + if (X) tmp |= 128; + Out << "\t.byte " << tmp << "\n"; + } while(X); +} + +//Assign a number to each Function +void getMappingInfoForFunction::createFunctionKey(Module *M){ + int i = 0; + int j = 0; + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <=1) continue; + Fkey[FI] = i; + ++i; + } +} + +//Assign a Number to each BB +void getMappingInfoForFunction::createBasicBlockKey(Module *M){ + int i = 0; + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + // int i = 0; + if(FI->size() <= 1) continue; + for (Function::iterator BI = FI->begin(), BE = FI->end(); + BI != BE; ++BI){ + MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI); + BBkey[miBB[0]] = i; + i = i+(miBB.size()); + } + } +} + +void getMappingInfoForFunction::createMachineInstructionKey(Module *M){ + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <= 1) continue; + for (Function::iterator BI=FI->begin(), BE=FI->end(); + BI != BE; ++BI){ + MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI); + int j = 0; + for (MachineCodeForBasicBlock::iterator miI = miBB.begin(), + miE = miBB.end(); miI != miE; ++miI, ++j){ + MIkey[*miI] = j; + } + } + } +} + +void getMappingInfoForFunction::createBBToMImap(Module *M){ + //go thro each function in the module + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <= 1)continue; + //go thro each basic block in that function + int i = 0; + for (Function::iterator BI = FI->begin(), + BE = FI->end(); BI != BE; ++BI){ + //create a Map record + //get the corresponding machine instruction + MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI); + //add record into the map + BBmap.push_back(vector()); + vector &oneBB = BBmap.back(); + oneBB.reserve(4); + + //add the function number + oneBB.push_back(Fkey[FI]); + //add the machine instruction number + oneBB.push_back( i ); + oneBB.push_back( BBkey[ miBB[0] ]); + //add the number of instructions + oneBB.push_back(miBB.size()); + ++i; + + } + } +} + +void getMappingInfoForFunction::createLLVMToMImap(Module *M){ + + for (Module::iterator FI = M->begin(), FE = M->end(); + FI != FE; ++FI){ + if(FI->size() <= 1) continue; + int i =0; + for (Function::iterator BI = FI->begin(), BE = FI->end(); + BI != BE; ++BI, ++i){ + int j = 0; + for (BasicBlock::iterator II = BI->begin(), + IE = BI->end(); II != IE; ++II, ++j){ + MachineCodeForInstruction& miI = + MachineCodeForInstruction::get(II); + for (MachineCodeForInstruction::iterator miII = miI.begin(), + miIE = miI.end(); miII != miIE; ++miII){ + + vector oneMI; + oneMI.push_back(Fkey[FI]); + oneMI.push_back(i); + oneMI.push_back(j); + oneMI.push_back(MIkey[*miII]); + MImap.push_back(oneMI); + } + } + } + } +} + + -- 2.34.1