1 //===- lib/MC/MCObjectStreamer.cpp - Object File MCStreamer Interface -----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/MC/MCObjectStreamer.h"
12 #include "llvm/Support/ErrorHandling.h"
13 #include "llvm/MC/MCAssembler.h"
14 #include "llvm/MC/MCExpr.h"
17 MCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB,
18 raw_ostream &_OS, MCCodeEmitter *_Emitter)
19 : MCStreamer(Context), Assembler(new MCAssembler(Context, TAB,
25 MCObjectStreamer::~MCObjectStreamer() {
29 MCFragment *MCObjectStreamer::getCurrentFragment() const {
30 assert(getCurrentSectionData() && "No current section!");
32 if (!getCurrentSectionData()->empty())
33 return &getCurrentSectionData()->getFragmentList().back();
38 MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const {
39 MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
41 F = new MCDataFragment(getCurrentSectionData());
45 const MCExpr *MCObjectStreamer::AddValueSymbols(const MCExpr *Value) {
46 switch (Value->getKind()) {
47 case MCExpr::Target: llvm_unreachable("Can't handle target exprs yet!");
48 case MCExpr::Constant:
51 case MCExpr::Binary: {
52 const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value);
53 AddValueSymbols(BE->getLHS());
54 AddValueSymbols(BE->getRHS());
58 case MCExpr::SymbolRef:
59 Assembler->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol());
63 AddValueSymbols(cast<MCUnaryExpr>(Value)->getSubExpr());
70 void MCObjectStreamer::SwitchSection(const MCSection *Section) {
71 assert(Section && "Cannot switch to a null section!");
73 // If already in this section, then this is a noop.
74 if (Section == CurSection) return;
77 CurSectionData = &getAssembler().getOrCreateSectionData(*Section);
80 void MCObjectStreamer::Finish() {
81 getAssembler().Finish();