aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/SparcV9/MappingInfo.cpp
diff options
context:
space:
mode:
authorAnand Shukla <ashukla@cs.uiuc.edu>2002-08-27 22:47:33 +0000
committerAnand Shukla <ashukla@cs.uiuc.edu>2002-08-27 22:47:33 +0000
commitb85d265b16110454a466db9e909a727b746e6c30 (patch)
tree0188bb29b38614707cd9cbeb61e8c363974adb8d /lib/Target/SparcV9/MappingInfo.cpp
parent894e83010014ac3f3a59a8e5362fa454e37994b3 (diff)
downloadexternal_llvm-b85d265b16110454a466db9e909a727b746e6c30.zip
external_llvm-b85d265b16110454a466db9e909a727b746e6c30.tar.gz
external_llvm-b85d265b16110454a466db9e909a727b746e6c30.tar.bz2
moved this file from lib/Reoptimizer/Mapping
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3519 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SparcV9/MappingInfo.cpp')
-rw-r--r--lib/Target/SparcV9/MappingInfo.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/lib/Target/SparcV9/MappingInfo.cpp b/lib/Target/SparcV9/MappingInfo.cpp
new file mode 100644
index 0000000..65c2210
--- /dev/null
+++ b/lib/Target/SparcV9/MappingInfo.cpp
@@ -0,0 +1,191 @@
+//===- 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
+// Currently Sparc specific but will be extended for others later
+//
+//===--------------------------------------------------------------------===//
+
+#include "llvm/Reoptimizer/Mapping/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 <map>
+using std::vector;
+
+
+// MappingInfo - This method collects mapping info
+// for the mapping from LLVM to machine code.
+//
+namespace {
+ class getMappingInfoForFunction : public FunctionPass {
+ std::ostream &Out;
+ public:
+ getMappingInfoForFunction(std::ostream &out) : Out(out){}
+ const char* getPassName() const{return "Sparc MappingInformation";}
+ bool runOnFunction(Function &FI);
+ private:
+ std::map<const Function*, unsigned> Fkey; //key of F to num
+ std::map<const MachineInstr*, unsigned> BBkey; //key BB to num
+ std::map<const MachineInstr*, unsigned> MIkey; //key MI to num
+
+ bool doInitialization(Module &M);
+ void create_BB_to_MInumber_Key(Function &FI);
+ void create_MI_to_number_Key(Function &FI);
+ void writeBBToMImap(Function &FI);
+ void writeLLVMToMImap(Function &FI);
+ void getMappingInfoForFunction::writePrologue(const char * area,
+ const char *label,
+ unsigned FunctionNo);
+ void getMappingInfoForFunction::writeEpilogue(const char *area,
+ const char *label,
+ unsigned FunctionNo);
+ unsigned writeNumber(unsigned X);
+ };
+}
+
+
+//pass definition
+Pass *MappingInfoForFunction(std::ostream &out){
+ return (new getMappingInfoForFunction(out));
+}
+
+//function definitions :
+//create and output maps to the .s file
+bool getMappingInfoForFunction::runOnFunction(Function &FI) {
+
+
+ //first create reference maps
+ //createFunctionKey(M);
+ create_BB_to_MInumber_Key(FI);
+ create_MI_to_number_Key(FI);
+ unsigned FunctionNo = Fkey[&(FI)];
+
+ //now print out the maps
+ writePrologue("BB TO MI MAP", "BBMIMap", FunctionNo);
+ writeBBToMImap(FI);
+ writeEpilogue("BB TO MI MAP", "BBMIMap", FunctionNo);
+
+ writePrologue("LLVM I TO MI MAP", "LMIMap", FunctionNo);
+ writeLLVMToMImap(FI);
+ writeEpilogue("LLVM I TO MI MAP", "LMIMap", FunctionNo);
+ return false;
+}
+
+void getMappingInfoForFunction::writePrologue(const char *area,
+ const char *label,
+ unsigned FunctionNo){
+ Out << "!" << area << "\n";
+ Out << "\t.section \".rodata\"\n\t.align 8\n";
+ Out << "\t.global " << label << FunctionNo << "\n";
+ Out << "\t.type " << label << FunctionNo << ",#object\n";
+ Out << label << FunctionNo << ":\n";
+ Out << "\t.word .end_" << label << FunctionNo << "-"
+ << label << FunctionNo << "\n";
+}
+
+void getMappingInfoForFunction::writeEpilogue(const char *area,
+ const char *label,
+ unsigned FunctionNo){
+ Out << ".end_" << label << FunctionNo << ":\n";
+ Out << "\t.size " << label << FunctionNo << ", .end_"
+ << label << FunctionNo << "-" << label
+ << FunctionNo << "\n\n\n\n";
+}
+
+//write out information as .byte directives
+unsigned getMappingInfoForFunction::writeNumber(unsigned X) {
+ unsigned i=0;
+ do {
+ unsigned tmp = X & 127;
+ X >>= 7;
+ if (X) tmp |= 128;
+ Out << "\t.byte " << tmp << "\n";
+ ++i;
+ } while(X);
+ return i;
+}
+
+//Assign a number to each Function
+bool getMappingInfoForFunction::doInitialization(Module &M){
+ unsigned i = 0;
+ for (Module::iterator FI = M.begin(), FE = M.end();
+ FI != FE; ++FI){
+ //dont count F with 0 BBs
+ if(FI->isExternal()) continue;
+ Fkey[FI] = i;
+ ++i;
+ }
+ return false;
+}
+
+//Assign a Number to each BB
+void getMappingInfoForFunction::create_BB_to_MInumber_Key(Function &FI){
+ unsigned i = 0;
+ 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());
+ }
+}
+
+//Assign a number to each MI wrt beginning of the BB
+void getMappingInfoForFunction::create_MI_to_number_Key(Function &FI){
+ for (Function::iterator BI=FI.begin(), BE=FI.end();
+ BI != BE; ++BI){
+ MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI);
+ unsigned j = 0;
+ for(MachineCodeForBasicBlock::iterator miI=miBB.begin(), miE=miBB.end();
+ miI!=miE; ++miI, ++j){
+ MIkey[*miI]=j;
+ }
+ }
+}
+
+//BBtoMImap: contains F#, BB#,
+// MI#[wrt beginning of F], #MI in BB
+void getMappingInfoForFunction::writeBBToMImap(Function &FI){
+ unsigned bb=0;
+ for (Function::iterator BI = FI.begin(),
+ BE = FI.end(); BI != BE; ++BI, ++bb){
+ MachineCodeForBasicBlock &miBB = MachineCodeForBasicBlock::get(BI);
+ writeNumber(bb);
+ //Out << " BB: "<<(void *)BI<<"\n";
+ //for(int i=0; i<miBB.size(); ++i)
+ //Out<<*miBB[i]<<"\n";
+ writeNumber( BBkey[ miBB[0] ]);
+ writeNumber(miBB.size());
+ }
+}
+
+//LLVMtoMImap: contains F#, BB#, LLVM#,
+// MIs[wrt to beginning of BB]
+void getMappingInfoForFunction::writeLLVMToMImap(Function &FI){
+
+ unsigned bb =0;
+ for (Function::iterator BI = FI.begin(), BE = FI.end();
+ BI != BE; ++BI, ++bb){
+ unsigned li = 0;
+ writeNumber(bb);
+ //Out << "BB: "<<(void *)BI<<"\n";
+ writeNumber(BI->size());
+ for (BasicBlock::iterator II = BI->begin(),
+ IE = BI->end(); II != IE; ++II, ++li){
+ //Out << "I: "<<*II<<"\n";
+ MachineCodeForInstruction& miI =
+ MachineCodeForInstruction::get(II);
+
+ //do for each corr. MI
+ writeNumber(li);
+ writeNumber(miI.size());
+ for (MachineCodeForInstruction::iterator miII = miI.begin(),
+ miIE = miI.end(); miII != miIE; ++miII){
+ //Out << "MI: "<<**miII<<"\n";
+ writeNumber(MIkey[*miII]);
+ }
+ }
+ }
+}