fixed valgrind issues of prior commit, this change applies r169456 changes back to the tree with fixes. on darwin no valgrind issues exist in the tests that used to fail.

original change description:

change MCContext to work on the doInitialization/doFinalization model

reviewed by Evan Cheng <evan.cheng@apple.com>




git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169553 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Pedro Artigas 2012-12-06 22:12:44 +00:00
parent 5b4af8b52a
commit 873a1dd7d6
3 changed files with 65 additions and 10 deletions

View File

@ -137,11 +137,16 @@ namespace llvm {
void *MachOUniquingMap, *ELFUniquingMap, *COFFUniquingMap;
/// Do automatic initialization in constructor and finalization in
/// destructor
bool AutoInitializationFinalization;
MCSymbol *CreateSymbol(StringRef Name);
public:
explicit MCContext(const MCAsmInfo &MAI, const MCRegisterInfo &MRI,
const MCObjectFileInfo *MOFI, const SourceMgr *Mgr = 0);
const MCObjectFileInfo *MOFI, const SourceMgr *Mgr = 0,
bool AutoInitializationFinalization = true);
~MCContext();
const SourceMgr *getSourceManager() const { return SrcMgr; }
@ -154,6 +159,17 @@ namespace llvm {
void setAllowTemporaryLabels(bool Value) { AllowTemporaryLabels = Value; }
/// @name Module Lifetime Management
/// @{
/// doInitialization - prepare to process a new module
void doInitialization();
/// doFinalization - clean up state from the current module
void doFinalization();
/// @}
/// @name Symbol Management
/// @{

View File

@ -253,7 +253,7 @@ void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI,
const MCRegisterInfo &MRI,
const MCObjectFileInfo *MOFI)
: ImmutablePass(ID), Context(MAI, MRI, MOFI) {
: ImmutablePass(ID), Context(MAI, MRI, MOFI, 0, false) {
initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry());
}
@ -270,6 +270,9 @@ MachineModuleInfo::~MachineModuleInfo() {
}
bool MachineModuleInfo::doInitialization(Module &M) {
Context.doInitialization();
ObjFileMMI = 0;
CompactUnwindEncoding = 0;
CurCallSite = 0;
@ -291,6 +294,8 @@ bool MachineModuleInfo::doFinalization(Module &M) {
delete AddrLabelSymbols;
AddrLabelSymbols = 0;
Context.doFinalization();
return false;
}

View File

@ -31,12 +31,14 @@ typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
MCContext::MCContext(const MCAsmInfo &mai, const MCRegisterInfo &mri,
const MCObjectFileInfo *mofi, const SourceMgr *mgr) :
const MCObjectFileInfo *mofi, const SourceMgr *mgr,
bool DoAutoInitializationFinalization ) :
SrcMgr(mgr), MAI(mai), MRI(mri), MOFI(mofi),
Allocator(), Symbols(Allocator), UsedNames(Allocator),
NextUniqueID(0),
CurrentDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0),
AllowTemporaryLabels(true) {
AllowTemporaryLabels(true),
AutoInitializationFinalization(DoAutoInitializationFinalization) {
MachOUniquingMap = 0;
ELFUniquingMap = 0;
COFFUniquingMap = 0;
@ -45,22 +47,54 @@ MCContext::MCContext(const MCAsmInfo &mai, const MCRegisterInfo &mri,
SecureLog = 0;
SecureLogUsed = false;
if (AutoInitializationFinalization)
doInitialization();
}
MCContext::~MCContext() {
if (AutoInitializationFinalization)
doFinalization();
// NOTE: The symbols are all allocated out of a bump pointer allocator,
// we don't need to free them here.
// If the stream for the .secure_log_unique directive was created free it.
delete (raw_ostream*)SecureLog;
}
//===----------------------------------------------------------------------===//
// Module Lifetime Management
//===----------------------------------------------------------------------===//
void MCContext::doInitialization() {
NextUniqueID = 0;
AllowTemporaryLabels = true;
DwarfLocSeen = false;
GenDwarfForAssembly = false;
GenDwarfFileNumber = 0;
}
MCContext::~MCContext() {
// NOTE: The symbols are all allocated out of a bump pointer allocator,
// we don't need to free them here.
void MCContext::doFinalization() {
UsedNames.clear();
Symbols.clear();
Allocator.Reset();
Instances.clear();
MCDwarfFiles.clear();
MCDwarfDirs.clear();
MCGenDwarfLabelEntries.clear();
DwarfDebugFlags = StringRef();
MCLineSections.clear();
MCLineSectionOrder.clear();
CurrentDwarfLoc = MCDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0);
// If we have the MachO uniquing map, free it.
delete (MachOUniqueMapTy*)MachOUniquingMap;
delete (ELFUniqueMapTy*)ELFUniquingMap;
delete (COFFUniqueMapTy*)COFFUniquingMap;
// If the stream for the .secure_log_unique directive was created free it.
delete (raw_ostream*)SecureLog;
MachOUniquingMap = 0;
ELFUniquingMap = 0;
COFFUniquingMap = 0;
}
//===----------------------------------------------------------------------===//