1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

Let the new backend begin!

llvm-svn: 35242
This commit is contained in:
Anton Korobeynikov 2007-03-21 21:38:25 +00:00
parent fb7b59f5dd
commit bc43d296b2
5 changed files with 1596 additions and 2 deletions

View File

@ -376,7 +376,7 @@ case "$enableval" in
done
;;
esac
TARGETS_TO_BUILD="CBackend $TARGETS_TO_BUILD"
TARGETS_TO_BUILD="CBackend MSIL $TARGETS_TO_BUILD"
AC_SUBST(TARGETS_TO_BUILD,$TARGETS_TO_BUILD)
dnl Prevent the CBackend from using printf("%a") for floating point so older

2
configure vendored
View File

@ -4730,7 +4730,7 @@ echo "$as_me: error: Unrecognized target $a_target" >&2;}
done
;;
esac
TARGETS_TO_BUILD="CBackend $TARGETS_TO_BUILD"
TARGETS_TO_BUILD="CBackend MSIL $TARGETS_TO_BUILD"
TARGETS_TO_BUILD=$TARGETS_TO_BUILD

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,230 @@
//===-- MSILWriter.h - TargetMachine for the MSIL ---------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Roman Samoilov and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the MSILWriter that is used by the MSIL.
//
//===----------------------------------------------------------------------===//
#ifndef MSILWRITER_H
#define MSILWRITER_H
#include "llvm/Constants.h"
#include "llvm/Module.h"
#include "llvm/Instructions.h"
#include "llvm/Pass.h"
#include "llvm/PassManager.h"
#include "llvm/Analysis/FindUsedTypes.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Support/GetElementPtrTypeIterator.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetMachineRegistry.h"
#include "llvm/Support/Mangler.h"
#include <algorithm>
#include <ios>
using namespace llvm;
namespace {
class MSILModule : public ModulePass {
Module *ModulePtr;
const std::set<const Type *>*& UsedTypes;
const TargetData*& TD;
public:
MSILModule(const std::set<const Type *>*& _UsedTypes,
const TargetData*& _TD)
: UsedTypes(_UsedTypes), TD(_TD) {}
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<FindUsedTypes>();
AU.addRequired<TargetData>();
}
virtual const char *getPassName() const {
return "MSIL backend definitions";
}
virtual bool runOnModule(Module &M);
};
class MSILWriter : public FunctionPass {
struct StaticInitializer {
const Constant* constant;
uint64_t offset;
StaticInitializer()
: constant(0), offset(0) {}
StaticInitializer(const Constant* _constant, uint64_t _offset)
: constant(_constant), offset(_offset) {}
};
uint64_t UniqID;
uint64_t getUniqID() {
return ++UniqID;
}
public:
std::ostream &Out;
Module* ModulePtr;
const TargetData* TD;
Mangler* Mang;
LoopInfo *LInfo;
std::vector<StaticInitializer>* InitListPtr;
std::map<const GlobalVariable*,std::vector<StaticInitializer> >
StaticInitList;
const std::set<const Type *>* UsedTypes;
MSILWriter(std::ostream &o) : Out(o) {
UniqID = 0;
}
enum ValueType {
UndefVT,
GlobalVT,
InternalVT,
ArgumentVT,
LocalVT,
ConstVT,
ConstExprVT
};
bool isVariable(ValueType V) {
return V==GlobalVT || V==InternalVT || V==ArgumentVT || V==LocalVT;
}
bool isConstValue(ValueType V) {
return V==ConstVT || V==ConstExprVT;
}
virtual const char *getPassName() const { return "MSIL backend"; }
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<LoopInfo>();
AU.setPreservesAll();
}
bool runOnFunction(Function &F);
virtual bool doInitialization(Module &M);
virtual bool doFinalization(Module &M);
bool isZeroValue(const Value* V);
std::string getValueName(const Value* V);
std::string getLabelName(const Value* V);
std::string getLabelName(const std::string& Name);
std::string getConvModopt(unsigned CallingConvID);
std::string getArrayTypeName(Type::TypeID TyID, const Type* Ty);
std::string getPrimitiveTypeName(const Type* Ty, bool isSigned);
std::string getFunctionTypeName(const Type* Ty);
std::string getPointerTypeName(const Type* Ty);
std::string getTypeName(const Type* Ty, bool isSigned = false);
ValueType getValueLocation(const Value* V);
std::string getTypePostfix(const Type* Ty, bool Expand,
bool isSigned = false);
void printPtrLoad(uint64_t N);
void printConstLoad(const Constant* C);
void printValueLoad(const Value* V);
void printValueSave(const Value* V);
void printBinaryInstruction(const char* Name, const Value* Left,
const Value* Right);
void printSimpleInstruction(const char* Inst, const char* Operand = NULL);
void printPHICopy(const BasicBlock* Src, const BasicBlock* Dst);
void printBranchToBlock(const BasicBlock* CurrBB,
const BasicBlock* TrueBB,
const BasicBlock* FalseBB);
void printBranchInstruction(const BranchInst* Inst);
void printSelectInstruction(const Value* Cond, const Value* VTrue,
const Value* VFalse);
void printIndirectLoad(const Value* V);
void printStoreInstruction(const Instruction* Inst);
void printCastInstruction(unsigned int Op, const Value* V,
const Type* Ty);
void printGepInstruction(const Value* V, gep_type_iterator I,
gep_type_iterator E);
std::string getCallSignature(const FunctionType* Ty,
const Instruction* Inst,
std::string Name);
void printFunctionCall(const Value* FnVal, const Instruction* Inst);
void printCallInstruction(const Instruction* Inst);
void printICmpInstruction(unsigned Predicate, const Value* Left,
const Value* Right);
void printFCmpInstruction(unsigned Predicate, const Value* Left,
const Value* Right);
void printInvokeInstruction(const InvokeInst* Inst);
void printSwitchInstruction(const SwitchInst* Inst);
void printInstruction(const Instruction* Inst);
void printLoop(const Loop* L);
void printBasicBlock(const BasicBlock* BB);
void printLocalVariables(const Function& F);
void printFunctionBody(const Function& F);
void printConstantExpr(const ConstantExpr* CE);
void printStaticInitializerList();
void printFunction(const Function& F);
void printDeclarations(const TypeSymbolTable& ST);
unsigned int getBitWidth(const Type* Ty);
void printStaticConstant(const Constant* C, uint64_t& Offset);
void printStaticInitializer(const Constant* C, const std::string& Name);
void printVariableDefinition(const GlobalVariable* G);
void printGlobalVariables();
void printExternals();
};
}
#endif

14
lib/Target/MSIL/Makefile Normal file
View File

@ -0,0 +1,14 @@
##===- lib/Target/MSIL/Makefile ----------------------------*- Makefile -*-===##
#
# 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.
#
##===----------------------------------------------------------------------===##
LEVEL = ../../..
LIBRARYNAME = LLVMMSIL
include $(LEVEL)/Makefile.common
CompileCommonOpts := $(CompileCommonOpts) -Wno-format