Skip to content

Commit c5ddbad

Browse files
committed
MC: Provide MCAssembler with a TargetAsmBackend.
llvm-svn: 98222
1 parent 77c4141 commit c5ddbad

File tree

7 files changed

+27
-23
lines changed

7 files changed

+27
-23
lines changed

llvm/include/llvm/MC/MCAssembler.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class MCFragment;
2828
class MCSection;
2929
class MCSectionData;
3030
class MCSymbol;
31+
class TargetAsmBackend;
3132

3233
/// MCAsmFixup - Represent a fixed size region of bytes inside some fragment
3334
/// which needs to be rewritten. This region will either be rewritten by the
@@ -582,6 +583,8 @@ class MCAssembler {
582583

583584
MCContext &Context;
584585

586+
TargetAsmBackend &Backend;
587+
585588
raw_ostream &OS;
586589

587590
iplist<MCSectionData> Sections;
@@ -617,7 +620,7 @@ class MCAssembler {
617620
// concrete and require clients to pass in a target like object. The other
618621
// option is to make this abstract, and have targets provide concrete
619622
// implementations as we do with AsmParser.
620-
MCAssembler(MCContext &_Context, raw_ostream &OS);
623+
MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend, raw_ostream &OS);
621624
~MCAssembler();
622625

623626
MCContext &getContext() const { return Context; }

llvm/include/llvm/MC/MCStreamer.h

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ namespace llvm {
2727
class MCSection;
2828
class MCSymbol;
2929
class StringRef;
30+
class TargetAsmBackend;
3031
class Twine;
3132
class raw_ostream;
3233
class formatted_raw_ostream;
@@ -304,18 +305,10 @@ namespace llvm {
304305
MCCodeEmitter *CE = 0,
305306
bool ShowInst = false);
306307

307-
// FIXME: These two may end up getting rolled into a single
308-
// createObjectStreamer interface, which implements the assembler backend, and
309-
// is parameterized on an output object file writer.
310-
311308
/// createMachOStream - Create a machine code streamer which will generative
312309
/// Mach-O format object files.
313-
MCStreamer *createMachOStreamer(MCContext &Ctx, raw_ostream &OS,
314-
MCCodeEmitter *CE);
315-
316-
/// createELFStreamer - Create a machine code streamer which will generative
317-
/// ELF format object files.
318-
MCStreamer *createELFStreamer(MCContext &Ctx, raw_ostream &OS);
310+
MCStreamer *createMachOStreamer(MCContext &Ctx, TargetAsmBackend &TAB,
311+
raw_ostream &OS, MCCodeEmitter *CE);
319312

320313
} // end namespace llvm
321314

llvm/include/llvm/Target/TargetMachine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ class TargetMachine {
224224
/// implemented with the LLVM target-independent code generator.
225225
///
226226
class LLVMTargetMachine : public TargetMachine {
227+
std::string TargetTriple;
228+
227229
protected: // Can only create subclasses.
228230
LLVMTargetMachine(const Target &T, const std::string &TargetTriple);
229231

llvm/lib/CodeGen/LLVMTargetMachine.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ static cl::opt<bool> EnableSplitGEPGVN("split-gep-gvn", cl::Hidden,
9494
cl::desc("Split GEPs and run no-load GVN"));
9595

9696
LLVMTargetMachine::LLVMTargetMachine(const Target &T,
97-
const std::string &TargetTriple)
98-
: TargetMachine(T) {
97+
const std::string &Triple)
98+
: TargetMachine(T), TargetTriple(Triple) {
9999
AsmInfo = T.createAsmInfo(TargetTriple);
100100
}
101101

@@ -143,10 +143,11 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
143143
// Create the code emitter for the target if it exists. If not, .o file
144144
// emission fails.
145145
MCCodeEmitter *MCE = getTarget().createCodeEmitter(*this, *Context);
146-
if (MCE == 0)
146+
TargetAsmBackend *TAB = getTarget().createAsmBackend(TargetTriple);
147+
if (MCE == 0 || TAB == 0)
147148
return true;
148149

149-
AsmStreamer.reset(createMachOStreamer(*Context, Out, MCE));
150+
AsmStreamer.reset(createMachOStreamer(*Context, *TAB, Out, MCE));
150151

151152
// Any output to the asmprinter's "O" stream is bad and needs to be fixed,
152153
// force it to come out stderr.

llvm/lib/MC/MCAssembler.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -991,8 +991,9 @@ MCSymbolData::MCSymbolData(const MCSymbol &_Symbol, MCFragment *_Fragment,
991991

992992
/* *** */
993993

994-
MCAssembler::MCAssembler(MCContext &_Context, raw_ostream &_OS)
995-
: Context(_Context), OS(_OS), SubsectionsViaSymbols(false)
994+
MCAssembler::MCAssembler(MCContext &_Context, TargetAsmBackend &_Backend,
995+
raw_ostream &_OS)
996+
: Context(_Context), Backend(_Backend), OS(_OS), SubsectionsViaSymbols(false)
996997
{
997998
}
998999

llvm/lib/MC/MCMachOStreamer.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ class MCMachOStreamer : public MCStreamer {
5959
}
6060

6161
public:
62-
MCMachOStreamer(MCContext &Context, raw_ostream &_OS, MCCodeEmitter *_Emitter)
63-
: MCStreamer(Context), Assembler(Context, _OS), Emitter(_Emitter),
62+
MCMachOStreamer(MCContext &Context, TargetAsmBackend &TAB,
63+
raw_ostream &_OS, MCCodeEmitter *_Emitter)
64+
: MCStreamer(Context), Assembler(Context, TAB, _OS), Emitter(_Emitter),
6465
CurSectionData(0) {}
6566
~MCMachOStreamer() {}
6667

@@ -398,7 +399,7 @@ void MCMachOStreamer::Finish() {
398399
Assembler.Finish();
399400
}
400401

401-
MCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS,
402-
MCCodeEmitter *CE) {
403-
return new MCMachOStreamer(Context, OS, CE);
402+
MCStreamer *llvm::createMachOStreamer(MCContext &Context, TargetAsmBackend &TAB,
403+
raw_ostream &OS, MCCodeEmitter *CE) {
404+
return new MCMachOStreamer(Context, TAB, OS, CE);
404405
}

llvm/tools/llvm-mc/llvm-mc.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "llvm/Support/SourceMgr.h"
2828
#include "llvm/Support/raw_ostream.h"
2929
#include "llvm/System/Signals.h"
30+
#include "llvm/Target/TargetAsmBackend.h"
3031
#include "llvm/Target/TargetAsmParser.h"
3132
#include "llvm/Target/TargetData.h"
3233
#include "llvm/Target/TargetRegistry.h"
@@ -259,6 +260,7 @@ static int AssembleInput(const char *ProgName) {
259260
OwningPtr<MCInstPrinter> IP;
260261
OwningPtr<MCCodeEmitter> CE;
261262
OwningPtr<MCStreamer> Str;
263+
OwningPtr<TargetAsmBackend> TAB;
262264

263265
const MCAsmInfo *MAI = TheTarget->createAsmInfo(TripleName);
264266
assert(MAI && "Unable to create target asm info!");
@@ -274,7 +276,8 @@ static int AssembleInput(const char *ProgName) {
274276
} else {
275277
assert(FileType == OFT_ObjectFile && "Invalid file type!");
276278
CE.reset(TheTarget->createCodeEmitter(*TM, Ctx));
277-
Str.reset(createMachOStreamer(Ctx, *Out, CE.get()));
279+
TAB.reset(TheTarget->createAsmBackend(TripleName));
280+
Str.reset(createMachOStreamer(Ctx, *TAB, *Out, CE.get()));
278281
}
279282

280283
AsmParser Parser(SrcMgr, Ctx, *Str.get(), *MAI);

0 commit comments

Comments
 (0)