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/MCCodeEmitter.h" 15 #include "llvm/MC/MCExpr.h" 16 #include "llvm/Target/TargetAsmBackend.h" 17 using namespace llvm; 18 19 MCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB, 20 raw_ostream &_OS, MCCodeEmitter *_Emitter, 21 bool _PadSectionToAlignment) 22 : MCStreamer(Context), Assembler(new MCAssembler(Context, TAB, 23 *_Emitter, 24 _PadSectionToAlignment, 25 _OS)), 26 CurSectionData(0) 27 { 28 } 29 30 MCObjectStreamer::~MCObjectStreamer() { 31 delete &Assembler->getBackend(); 32 delete &Assembler->getEmitter(); 33 delete Assembler; 34 } 35 36 MCFragment *MCObjectStreamer::getCurrentFragment() const { 37 assert(getCurrentSectionData() && "No current section!"); 38 39 if (!getCurrentSectionData()->empty()) 40 return &getCurrentSectionData()->getFragmentList().back(); 41 42 return 0; 43 } 44 45 MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const { 46 MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment()); 47 if (!F) 48 F = new MCDataFragment(getCurrentSectionData()); 49 return F; 50 } 51 52 const MCExpr *MCObjectStreamer::AddValueSymbols(const MCExpr *Value) { 53 switch (Value->getKind()) { 54 case MCExpr::Target: llvm_unreachable("Can't handle target exprs yet!"); 55 case MCExpr::Constant: 56 break; 57 58 case MCExpr::Binary: { 59 const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 60 AddValueSymbols(BE->getLHS()); 61 AddValueSymbols(BE->getRHS()); 62 break; 63 } 64 65 case MCExpr::SymbolRef: 66 Assembler->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 67 break; 68 69 case MCExpr::Unary: 70 AddValueSymbols(cast<MCUnaryExpr>(Value)->getSubExpr()); 71 break; 72 } 73 74 return Value; 75 } 76 77 void MCObjectStreamer::SwitchSection(const MCSection *Section) { 78 assert(Section && "Cannot switch to a null section!"); 79 80 // If already in this section, then this is a noop. 81 if (Section == CurSection) return; 82 83 PrevSection = CurSection; 84 CurSection = Section; 85 CurSectionData = &getAssembler().getOrCreateSectionData(*Section); 86 } 87 88 void MCObjectStreamer::Finish() { 89 getAssembler().Finish(); 90 } 91