mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
Use unique_ptr to own MCFunctions within MCModule.
MCModule's ctor had to be moved out of line so the definition of MCFunction was available. (ctor requires the dtor of members (in case the ctor throws) which required access to the dtor of MCFunction) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206244 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
570e52c6f1
commit
ff2bf1bb8d
@ -73,7 +73,7 @@ class MCModule {
|
||||
|
||||
/// \name Function tracking
|
||||
/// @{
|
||||
typedef std::vector<MCFunction*> FunctionListTy;
|
||||
typedef std::vector<std::unique_ptr<MCFunction>> FunctionListTy;
|
||||
FunctionListTy Functions;
|
||||
/// @}
|
||||
|
||||
@ -87,7 +87,7 @@ class MCModule {
|
||||
friend class MCObjectDisassembler;
|
||||
|
||||
public:
|
||||
MCModule() : Entrypoint(0) { }
|
||||
MCModule();
|
||||
~MCModule();
|
||||
|
||||
/// \name Create a new MCAtom covering the specified offset range.
|
||||
|
@ -7,6 +7,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/MC/MCModule.h"
|
||||
#include "llvm/MC/MCAtom.h"
|
||||
#include "llvm/MC/MCFunction.h"
|
||||
@ -99,8 +100,9 @@ MCAtom *MCModule::findFirstAtomAfter(uint64_t Addr) {
|
||||
}
|
||||
|
||||
MCFunction *MCModule::createFunction(StringRef Name) {
|
||||
Functions.push_back(new MCFunction(Name, this));
|
||||
return Functions.back();
|
||||
std::unique_ptr<MCFunction> MCF(new MCFunction(Name, this));
|
||||
Functions.push_back(std::move(MCF));
|
||||
return Functions.back().get();
|
||||
}
|
||||
|
||||
static bool CompBBToAtom(MCBasicBlock *BB, const MCTextAtom *Atom) {
|
||||
@ -130,13 +132,11 @@ void MCModule::trackBBForAtom(const MCTextAtom *Atom, MCBasicBlock *BB) {
|
||||
BBsByAtom.insert(I, BB);
|
||||
}
|
||||
|
||||
MCModule::MCModule() : Entrypoint(0) { }
|
||||
|
||||
MCModule::~MCModule() {
|
||||
for (AtomListTy::iterator AI = atom_begin(),
|
||||
AE = atom_end();
|
||||
AI != AE; ++AI)
|
||||
delete *AI;
|
||||
for (FunctionListTy::iterator FI = func_begin(),
|
||||
FE = func_end();
|
||||
FI != FE; ++FI)
|
||||
delete *FI;
|
||||
}
|
||||
|
@ -278,7 +278,7 @@ class MCModule2YAML {
|
||||
const MCModule &MCM;
|
||||
MCModuleYAML::Module YAMLModule;
|
||||
void dumpAtom(const MCAtom *MCA);
|
||||
void dumpFunction(const MCFunction *MCF);
|
||||
void dumpFunction(const MCFunction &MCF);
|
||||
void dumpBasicBlock(const MCBasicBlock *MCBB);
|
||||
|
||||
public:
|
||||
@ -302,7 +302,7 @@ MCModule2YAML::MCModule2YAML(const MCModule &MCM) : MCM(MCM), YAMLModule() {
|
||||
dumpAtom(*AI);
|
||||
for (MCModule::const_func_iterator FI = MCM.func_begin(), FE = MCM.func_end();
|
||||
FI != FE; ++FI)
|
||||
dumpFunction(*FI);
|
||||
dumpFunction(**FI);
|
||||
}
|
||||
|
||||
void MCModule2YAML::dumpAtom(const MCAtom *MCA) {
|
||||
@ -330,11 +330,11 @@ void MCModule2YAML::dumpAtom(const MCAtom *MCA) {
|
||||
}
|
||||
}
|
||||
|
||||
void MCModule2YAML::dumpFunction(const MCFunction *MCF) {
|
||||
void MCModule2YAML::dumpFunction(const MCFunction &MCF) {
|
||||
YAMLModule.Functions.resize(YAMLModule.Functions.size() + 1);
|
||||
MCModuleYAML::Function &F = YAMLModule.Functions.back();
|
||||
F.Name = MCF->getName();
|
||||
for (MCFunction::const_iterator BBI = MCF->begin(), BBE = MCF->end();
|
||||
F.Name = MCF.getName();
|
||||
for (MCFunction::const_iterator BBI = MCF.begin(), BBE = MCF.end();
|
||||
BBI != BBE; ++BBI) {
|
||||
const MCBasicBlock &MCBB = **BBI;
|
||||
F.BasicBlocks.resize(F.BasicBlocks.size() + 1);
|
||||
|
@ -480,7 +480,7 @@ MCObjectDisassembler::createFunction(MCModule *Module, uint64_t BeginAddr,
|
||||
continue;
|
||||
// FIXME: MCModule should provide a findFunctionByAddr()
|
||||
if ((*FI)->getEntryBlock()->getInsts()->getBeginAddr() == BeginAddr)
|
||||
return *FI;
|
||||
return FI->get();
|
||||
}
|
||||
|
||||
// Finally, just create a new one.
|
||||
|
Loading…
x
Reference in New Issue
Block a user