mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-11 16:37:42 +00:00
Plug the remaining MC leaks by giving MCObjectStreamer/MCAsmStreamer ownership of the TargetAsmBackend and the MCCodeEmitter.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109767 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c46a5f20c5
commit
1abcd06856
@ -331,7 +331,7 @@ namespace llvm {
|
||||
/// InstPrint.
|
||||
///
|
||||
/// \param CE - If given, a code emitter to use to show the instruction
|
||||
/// encoding inline with the assembly.
|
||||
/// encoding inline with the assembly. This method takes ownership of \arg CE.
|
||||
///
|
||||
/// \param ShowInst - Whether to show the MCInst representation inline with
|
||||
/// the assembly.
|
||||
@ -343,12 +343,16 @@ namespace llvm {
|
||||
|
||||
/// createMachOStreamer - Create a machine code streamer which will generate
|
||||
/// Mach-O format object files.
|
||||
///
|
||||
/// Takes ownership of \arg TAB and \arg CE.
|
||||
MCStreamer *createMachOStreamer(MCContext &Ctx, TargetAsmBackend &TAB,
|
||||
raw_ostream &OS, MCCodeEmitter *CE,
|
||||
bool RelaxAll = false);
|
||||
|
||||
/// createWinCOFFStreamer - Create a machine code streamer which will
|
||||
/// generate Microsoft COFF format object files.
|
||||
///
|
||||
/// Takes ownership of \arg TAB and \arg CE.
|
||||
MCStreamer *createWinCOFFStreamer(MCContext &Ctx,
|
||||
TargetAsmBackend &TAB,
|
||||
MCCodeEmitter &CE, raw_ostream &OS);
|
||||
|
@ -278,9 +278,9 @@ namespace llvm {
|
||||
///
|
||||
/// \arg TT - The target triple.
|
||||
/// \arg Ctx - The target context.
|
||||
/// \arg TAB - The target assembler backend object.
|
||||
/// \arg TAB - The target assembler backend object. Takes ownership.
|
||||
/// \arg _OS - The stream object.
|
||||
/// \arg _Emitter - The target independent assembler object.
|
||||
/// \arg _Emitter - The target independent assembler object.Takes ownership.
|
||||
/// \arg RelaxAll - Relax all fixups?
|
||||
MCStreamer *createObjectStreamer(const std::string &TT, MCContext &Ctx,
|
||||
TargetAsmBackend &TAB,
|
||||
|
@ -139,8 +139,6 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
|
||||
getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI);
|
||||
|
||||
// Create a code emitter if asked to show the encoding.
|
||||
//
|
||||
// FIXME: These are currently leaked.
|
||||
MCCodeEmitter *MCE = 0;
|
||||
if (ShowMCEncoding)
|
||||
MCE = getTarget().createCodeEmitter(*this, *Context);
|
||||
@ -154,8 +152,6 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
|
||||
case CGFT_ObjectFile: {
|
||||
// Create the code emitter for the target if it exists. If not, .o file
|
||||
// emission fails.
|
||||
//
|
||||
// FIXME: These are currently leaked.
|
||||
MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this, *Context);
|
||||
TargetAsmBackend *TAB = getTarget().createAsmBackend(TargetTriple);
|
||||
if (MCE == 0 || TAB == 0)
|
||||
|
@ -31,7 +31,7 @@ class MCAsmStreamer : public MCStreamer {
|
||||
formatted_raw_ostream &OS;
|
||||
const MCAsmInfo &MAI;
|
||||
OwningPtr<MCInstPrinter> InstPrinter;
|
||||
MCCodeEmitter *Emitter;
|
||||
OwningPtr<MCCodeEmitter> Emitter;
|
||||
|
||||
SmallString<128> CommentToEmit;
|
||||
raw_svector_ostream CommentStream;
|
||||
|
@ -11,7 +11,9 @@
|
||||
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/MC/MCAssembler.h"
|
||||
#include "llvm/MC/MCCodeEmitter.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/Target/TargetAsmBackend.h"
|
||||
using namespace llvm;
|
||||
|
||||
MCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB,
|
||||
@ -23,6 +25,8 @@ MCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB,
|
||||
}
|
||||
|
||||
MCObjectStreamer::~MCObjectStreamer() {
|
||||
delete &Assembler->getBackend();
|
||||
delete &Assembler->getEmitter();
|
||||
delete Assembler;
|
||||
}
|
||||
|
||||
|
@ -287,25 +287,24 @@ static int AssembleInput(const char *ProgName) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
OwningPtr<MCCodeEmitter> CE;
|
||||
OwningPtr<MCStreamer> Str;
|
||||
OwningPtr<TargetAsmBackend> TAB;
|
||||
|
||||
if (FileType == OFT_AssemblyFile) {
|
||||
MCInstPrinter *IP =
|
||||
TheTarget->createMCInstPrinter(OutputAsmVariant, *MAI);
|
||||
MCCodeEmitter *CE = 0;
|
||||
if (ShowEncoding)
|
||||
CE.reset(TheTarget->createCodeEmitter(*TM, Ctx));
|
||||
CE = TheTarget->createCodeEmitter(*TM, Ctx);
|
||||
Str.reset(createAsmStreamer(Ctx, *Out,TM->getTargetData()->isLittleEndian(),
|
||||
/*asmverbose*/true, IP, CE.get(), ShowInst));
|
||||
/*asmverbose*/true, IP, CE, ShowInst));
|
||||
} else if (FileType == OFT_Null) {
|
||||
Str.reset(createNullStreamer(Ctx));
|
||||
} else {
|
||||
assert(FileType == OFT_ObjectFile && "Invalid file type!");
|
||||
CE.reset(TheTarget->createCodeEmitter(*TM, Ctx));
|
||||
TAB.reset(TheTarget->createAsmBackend(TripleName));
|
||||
MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM, Ctx);
|
||||
TargetAsmBackend *TAB = TheTarget->createAsmBackend(TripleName);
|
||||
Str.reset(TheTarget->createObjectStreamer(TripleName, Ctx, *TAB,
|
||||
*Out, CE.get(), RelaxAll));
|
||||
*Out, CE, RelaxAll));
|
||||
}
|
||||
|
||||
if (EnableLogging) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user