MCObjectStreamer.cpp revision 8067adc271d7ccfcd28a238d73942b21a5e2bc62
1//===- lib/MC/MCObjectStreamer.cpp - Object File MCStreamer Interface -----===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "llvm/MC/MCObjectStreamer.h" 11 12#include "llvm/Support/ErrorHandling.h" 13#include "llvm/MC/MCAssembler.h" 14#include "llvm/MC/MCExpr.h" 15using namespace llvm; 16 17MCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB, 18 raw_ostream &_OS, MCCodeEmitter *_Emitter) 19 : MCStreamer(Context), Assembler(new MCAssembler(Context, TAB, 20 *_Emitter, _OS)), 21 CurSectionData(0) 22{ 23} 24 25MCObjectStreamer::~MCObjectStreamer() { 26 delete Assembler; 27} 28 29MCFragment *MCObjectStreamer::getCurrentFragment() const { 30 assert(getCurrentSectionData() && "No current section!"); 31 32 if (!getCurrentSectionData()->empty()) 33 return &getCurrentSectionData()->getFragmentList().back(); 34 35 return 0; 36} 37 38MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const { 39 MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment()); 40 if (!F) 41 F = new MCDataFragment(getCurrentSectionData()); 42 return F; 43} 44 45const 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: 49 break; 50 51 case MCExpr::Binary: { 52 const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 53 AddValueSymbols(BE->getLHS()); 54 AddValueSymbols(BE->getRHS()); 55 break; 56 } 57 58 case MCExpr::SymbolRef: 59 Assembler->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 60 break; 61 62 case MCExpr::Unary: 63 AddValueSymbols(cast<MCUnaryExpr>(Value)->getSubExpr()); 64 break; 65 } 66 67 return Value; 68} 69 70void MCObjectStreamer::SwitchSection(const MCSection *Section) { 71 assert(Section && "Cannot switch to a null section!"); 72 73 // If already in this section, then this is a noop. 74 if (Section == CurSection) return; 75 76 CurSection = Section; 77 CurSectionData = &getAssembler().getOrCreateSectionData(*Section); 78} 79 80void MCObjectStreamer::Finish() { 81 getAssembler().Finish(); 82} 83