//===- lib/MC/MCObjectStreamer.cpp - Object File MCStreamer Interface -----===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/MC/MCObjectStreamer.h" #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, raw_ostream &_OS, MCCodeEmitter *_Emitter) : MCStreamer(Context), Assembler(new MCAssembler(Context, TAB, *_Emitter, _OS)), CurSectionData(0) { } MCObjectStreamer::~MCObjectStreamer() { delete &Assembler->getBackend(); delete &Assembler->getEmitter(); delete Assembler; } MCFragment *MCObjectStreamer::getCurrentFragment() const { assert(getCurrentSectionData() && "No current section!"); if (!getCurrentSectionData()->empty()) return &getCurrentSectionData()->getFragmentList().back(); return 0; } MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const { MCDataFragment *F = dyn_cast_or_null(getCurrentFragment()); if (!F) F = new MCDataFragment(getCurrentSectionData()); return F; } const MCExpr *MCObjectStreamer::AddValueSymbols(const MCExpr *Value) { switch (Value->getKind()) { case MCExpr::Target: llvm_unreachable("Can't handle target exprs yet!"); case MCExpr::Constant: break; case MCExpr::Binary: { const MCBinaryExpr *BE = cast(Value); AddValueSymbols(BE->getLHS()); AddValueSymbols(BE->getRHS()); break; } case MCExpr::SymbolRef: Assembler->getOrCreateSymbolData(cast(Value)->getSymbol()); break; case MCExpr::Unary: AddValueSymbols(cast(Value)->getSubExpr()); break; } return Value; } void MCObjectStreamer::SwitchSection(const MCSection *Section) { assert(Section && "Cannot switch to a null section!"); // If already in this section, then this is a noop. if (Section == CurSection) return; PrevSection = CurSection; CurSection = Section; CurSectionData = &getAssembler().getOrCreateSectionData(*Section); } void MCObjectStreamer::Finish() { getAssembler().Finish(); }