mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-07 12:28:24 +00:00
Added MachineCodeForInstruction object as an argument to
TmpInstruction constructors because every TmpInstruction object has to be registered with a MachineCodeForInstruction to prevent leaks. This simplifies the user's code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6469 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -13,6 +13,7 @@ class InstrForest;
|
|||||||
class MachineInstr;
|
class MachineInstr;
|
||||||
class InstructionNode;
|
class InstructionNode;
|
||||||
class TargetMachine;
|
class TargetMachine;
|
||||||
|
class MachineCodeForInstruction;
|
||||||
class Pass;
|
class Pass;
|
||||||
|
|
||||||
//===--------------------- Required Functions ---------------------------------
|
//===--------------------- Required Functions ---------------------------------
|
||||||
@@ -68,14 +69,19 @@ class TmpInstruction : public Instruction {
|
|||||||
public:
|
public:
|
||||||
// Constructor that uses the type of S1 as the type of the temporary.
|
// Constructor that uses the type of S1 as the type of the temporary.
|
||||||
// s1 must be a valid value. s2 may be NULL.
|
// s1 must be a valid value. s2 may be NULL.
|
||||||
TmpInstruction(Value *s1, Value *s2 = 0, const std::string &name = "");
|
TmpInstruction(MachineCodeForInstruction& mcfi,
|
||||||
|
Value *s1, Value *s2 = 0, const std::string &name = "");
|
||||||
|
|
||||||
// Constructor that requires the type of the temporary to be specified.
|
// Constructor that requires the type of the temporary to be specified.
|
||||||
// Both S1 and S2 may be NULL.
|
// Both S1 and S2 may be NULL.
|
||||||
TmpInstruction(const Type *Ty, Value *s1 = 0, Value* s2 = 0,
|
TmpInstruction(MachineCodeForInstruction& mcfi,
|
||||||
|
const Type *Ty, Value *s1 = 0, Value* s2 = 0,
|
||||||
const std::string &name = "");
|
const std::string &name = "");
|
||||||
|
|
||||||
virtual Instruction *clone() const { return new TmpInstruction(*this); }
|
virtual Instruction *clone() const {
|
||||||
|
assert(0 && "Cannot clone TmpInstructions!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
virtual const char *getOpcodeName() const {
|
virtual const char *getOpcodeName() const {
|
||||||
return "TempValueForMachineInstr";
|
return "TempValueForMachineInstr";
|
||||||
}
|
}
|
||||||
|
@@ -78,8 +78,12 @@ namespace {
|
|||||||
static RegisterLLC<InstructionSelection>
|
static RegisterLLC<InstructionSelection>
|
||||||
X("instselect", "Instruction Selection", createInstructionSelectionPass);
|
X("instselect", "Instruction Selection", createInstructionSelectionPass);
|
||||||
|
|
||||||
TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name)
|
TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
|
||||||
: Instruction(s1->getType(), Instruction::UserOp1, name) {
|
Value *s1, Value *s2, const std::string &name)
|
||||||
|
: Instruction(s1->getType(), Instruction::UserOp1, name)
|
||||||
|
{
|
||||||
|
mcfi.addTemp(this);
|
||||||
|
|
||||||
Operands.push_back(Use(s1, this)); // s1 must be nonnull
|
Operands.push_back(Use(s1, this)); // s1 must be nonnull
|
||||||
if (s2) {
|
if (s2) {
|
||||||
Operands.push_back(Use(s2, this));
|
Operands.push_back(Use(s2, this));
|
||||||
@@ -91,9 +95,13 @@ TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name)
|
|||||||
|
|
||||||
// Constructor that requires the type of the temporary to be specified.
|
// Constructor that requires the type of the temporary to be specified.
|
||||||
// Both S1 and S2 may be NULL.(
|
// Both S1 and S2 may be NULL.(
|
||||||
TmpInstruction::TmpInstruction(const Type *Ty, Value *s1, Value* s2,
|
TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
|
||||||
|
const Type *Ty, Value *s1, Value* s2,
|
||||||
const std::string &name)
|
const std::string &name)
|
||||||
: Instruction(Ty, Instruction::UserOp1, name) {
|
: Instruction(Ty, Instruction::UserOp1, name)
|
||||||
|
{
|
||||||
|
mcfi.addTemp(this);
|
||||||
|
|
||||||
if (s1) { Operands.push_back(Use(s1, this)); }
|
if (s1) { Operands.push_back(Use(s1, this)); }
|
||||||
if (s2) { Operands.push_back(Use(s2, this)); }
|
if (s2) { Operands.push_back(Use(s2, this)); }
|
||||||
|
|
||||||
|
@@ -33,9 +33,8 @@ InsertCodeToLoadConstant(Function *F,
|
|||||||
TargetMachine& target)
|
TargetMachine& target)
|
||||||
{
|
{
|
||||||
// Create a tmp virtual register to hold the constant.
|
// Create a tmp virtual register to hold the constant.
|
||||||
TmpInstruction* tmpReg = new TmpInstruction(opValue);
|
|
||||||
MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr);
|
MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr);
|
||||||
mcfi.addTemp(tmpReg);
|
TmpInstruction* tmpReg = new TmpInstruction(mcfi, opValue);
|
||||||
|
|
||||||
target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg,
|
target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg,
|
||||||
loadConstVec, mcfi);
|
loadConstVec, mcfi);
|
||||||
|
@@ -78,8 +78,12 @@ namespace {
|
|||||||
static RegisterLLC<InstructionSelection>
|
static RegisterLLC<InstructionSelection>
|
||||||
X("instselect", "Instruction Selection", createInstructionSelectionPass);
|
X("instselect", "Instruction Selection", createInstructionSelectionPass);
|
||||||
|
|
||||||
TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name)
|
TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
|
||||||
: Instruction(s1->getType(), Instruction::UserOp1, name) {
|
Value *s1, Value *s2, const std::string &name)
|
||||||
|
: Instruction(s1->getType(), Instruction::UserOp1, name)
|
||||||
|
{
|
||||||
|
mcfi.addTemp(this);
|
||||||
|
|
||||||
Operands.push_back(Use(s1, this)); // s1 must be nonnull
|
Operands.push_back(Use(s1, this)); // s1 must be nonnull
|
||||||
if (s2) {
|
if (s2) {
|
||||||
Operands.push_back(Use(s2, this));
|
Operands.push_back(Use(s2, this));
|
||||||
@@ -91,9 +95,13 @@ TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name)
|
|||||||
|
|
||||||
// Constructor that requires the type of the temporary to be specified.
|
// Constructor that requires the type of the temporary to be specified.
|
||||||
// Both S1 and S2 may be NULL.(
|
// Both S1 and S2 may be NULL.(
|
||||||
TmpInstruction::TmpInstruction(const Type *Ty, Value *s1, Value* s2,
|
TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi,
|
||||||
|
const Type *Ty, Value *s1, Value* s2,
|
||||||
const std::string &name)
|
const std::string &name)
|
||||||
: Instruction(Ty, Instruction::UserOp1, name) {
|
: Instruction(Ty, Instruction::UserOp1, name)
|
||||||
|
{
|
||||||
|
mcfi.addTemp(this);
|
||||||
|
|
||||||
if (s1) { Operands.push_back(Use(s1, this)); }
|
if (s1) { Operands.push_back(Use(s1, this)); }
|
||||||
if (s2) { Operands.push_back(Use(s2, this)); }
|
if (s2) { Operands.push_back(Use(s2, this)); }
|
||||||
|
|
||||||
|
@@ -33,9 +33,8 @@ InsertCodeToLoadConstant(Function *F,
|
|||||||
TargetMachine& target)
|
TargetMachine& target)
|
||||||
{
|
{
|
||||||
// Create a tmp virtual register to hold the constant.
|
// Create a tmp virtual register to hold the constant.
|
||||||
TmpInstruction* tmpReg = new TmpInstruction(opValue);
|
|
||||||
MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr);
|
MachineCodeForInstruction &mcfi = MachineCodeForInstruction::get(vmInstr);
|
||||||
mcfi.addTemp(tmpReg);
|
TmpInstruction* tmpReg = new TmpInstruction(mcfi, opValue);
|
||||||
|
|
||||||
target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg,
|
target.getInstrInfo().CreateCodeToLoadConst(target, F, opValue, tmpReg,
|
||||||
loadConstVec, mcfi);
|
loadConstVec, mcfi);
|
||||||
|
Reference in New Issue
Block a user