forked from OSchip/llvm-project
Instead of storing std::string's for ExternalSymbol references, rely on the
fact that all ExternalSymbols are actually string literals with static storage. Thus we don't have to do anything special to hold them and we certainly don't have to copy string data around. llvm-svn: 18007
This commit is contained in:
parent
3db46bd0e1
commit
b3e3840e5c
|
@ -17,7 +17,6 @@
|
|||
#define LLVM_CODEGEN_MACHINEINSTR_H
|
||||
|
||||
#include "llvm/ADT/iterator"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cassert>
|
||||
|
||||
|
@ -121,7 +120,7 @@ private:
|
|||
int immedVal; // Constant value for an explicit constant
|
||||
|
||||
MachineBasicBlock *MBB; // For MO_MachineBasicBlock type
|
||||
std::string *SymbolName; // For MO_ExternalSymbol type
|
||||
const char *SymbolName; // For MO_ExternalSymbol type
|
||||
} contents;
|
||||
|
||||
char flags; // see bit field definitions above
|
||||
|
@ -177,10 +176,10 @@ private:
|
|||
extra.regNum = -1;
|
||||
}
|
||||
|
||||
MachineOperand(const std::string &SymName, bool isPCRelative, int Offset)
|
||||
MachineOperand(const char *SymName, bool isPCRelative, int Offset)
|
||||
: flags(isPCRelative?PCRELATIVE:0), opType(MO_ExternalSymbol) {
|
||||
zeroContents ();
|
||||
contents.SymbolName = new std::string (SymName);
|
||||
contents.SymbolName = SymName;
|
||||
extra.offset = Offset;
|
||||
}
|
||||
|
||||
|
@ -190,25 +189,16 @@ public:
|
|||
zeroContents ();
|
||||
contents = M.contents;
|
||||
extra = M.extra;
|
||||
if (isExternalSymbol())
|
||||
contents.SymbolName = new std::string(M.getSymbolName());
|
||||
}
|
||||
|
||||
|
||||
~MachineOperand() {
|
||||
if (isExternalSymbol())
|
||||
delete contents.SymbolName;
|
||||
}
|
||||
~MachineOperand() {}
|
||||
|
||||
const MachineOperand &operator=(const MachineOperand &MO) {
|
||||
if (isExternalSymbol()) // if old operand had a symbol name,
|
||||
delete contents.SymbolName; // release old memory
|
||||
contents = MO.contents;
|
||||
flags = MO.flags;
|
||||
opType = MO.opType;
|
||||
extra = MO.extra;
|
||||
if (isExternalSymbol())
|
||||
contents.SymbolName = new std::string(MO.getSymbolName());
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
@ -298,9 +288,9 @@ public:
|
|||
"Wrong MachineOperand accessor");
|
||||
return extra.offset;
|
||||
}
|
||||
const std::string &getSymbolName() const {
|
||||
const char *getSymbolName() const {
|
||||
assert(isExternalSymbol() && "Wrong MachineOperand accessor");
|
||||
return *contents.SymbolName;
|
||||
return contents.SymbolName;
|
||||
}
|
||||
|
||||
/// MachineOperand methods for testing that work on any kind of
|
||||
|
@ -658,7 +648,7 @@ public:
|
|||
|
||||
/// addExternalSymbolOperand - Add an external symbol operand to this instr
|
||||
///
|
||||
void addExternalSymbolOperand(const std::string &SymName, bool isPCRelative) {
|
||||
void addExternalSymbolOperand(const char *SymName, bool isPCRelative) {
|
||||
operands.push_back(MachineOperand(SymName, isPCRelative, 0));
|
||||
}
|
||||
|
||||
|
|
|
@ -129,9 +129,9 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
const MachineInstrBuilder &addExternalSymbol(const std::string &Name,
|
||||
const MachineInstrBuilder &addExternalSymbol(const char *FnName,
|
||||
bool isPCRelative = false) const{
|
||||
MI->addExternalSymbolOperand(Name, isPCRelative);
|
||||
MI->addExternalSymbolOperand(FnName, isPCRelative);
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue