MCObjectStreamer.cpp revision d076482ab7e672d1d65a43809695e8d0d3995203
18dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//===- lib/MC/MCObjectStreamer.cpp - Object File MCStreamer Interface -----===// 28dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// 38dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// The LLVM Compiler Infrastructure 48dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// 58dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// This file is distributed under the University of Illinois Open Source 68dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// License. See LICENSE.TXT for details. 78dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar// 88dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar//===----------------------------------------------------------------------===// 98dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar 108dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar#include "llvm/MC/MCObjectStreamer.h" 118dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar 128067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer#include "llvm/Support/ErrorHandling.h" 138dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar#include "llvm/MC/MCAssembler.h" 141abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer#include "llvm/MC/MCCodeEmitter.h" 1589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/MC/MCContext.h" 16f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola#include "llvm/MC/MCDwarf.h" 178067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer#include "llvm/MC/MCExpr.h" 18ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola#include "llvm/MC/MCSymbol.h" 191abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer#include "llvm/Target/TargetAsmBackend.h" 2089b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola#include "llvm/Target/TargetAsmInfo.h" 218dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbarusing namespace llvm; 228dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar 238dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel DunbarMCObjectStreamer::MCObjectStreamer(MCContext &Context, TargetAsmBackend &TAB, 24feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar raw_ostream &OS, MCCodeEmitter *Emitter_) 25feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar : MCStreamer(Context), 26feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar Assembler(new MCAssembler(Context, TAB, 27feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar *Emitter_, *TAB.createObjectWriter(OS), 28feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar OS)), 2983b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar CurSectionData(0) 308dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar{ 318dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar} 328dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar 338dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel DunbarMCObjectStreamer::~MCObjectStreamer() { 341abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer delete &Assembler->getBackend(); 351abcd06856df324eac98d4bf5ba673fb77ae6a11Benjamin Kramer delete &Assembler->getEmitter(); 36feb7ba3d9abfa1eb89f6da93c51649baaa931ab8Daniel Dunbar delete &Assembler->getWriter(); 378dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar delete Assembler; 388dc68ab931e0f0a7c5caf9cd341b2ec855733863Daniel Dunbar} 3983b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar 408067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. SpencerMCFragment *MCObjectStreamer::getCurrentFragment() const { 418067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer assert(getCurrentSectionData() && "No current section!"); 428067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 438067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer if (!getCurrentSectionData()->empty()) 448067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer return &getCurrentSectionData()->getFragmentList().back(); 458067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 468067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer return 0; 478067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer} 488067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 498067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. SpencerMCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const { 508067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment()); 518067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer if (!F) 528067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer F = new MCDataFragment(getCurrentSectionData()); 538067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer return F; 548067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer} 558067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 568067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencerconst MCExpr *MCObjectStreamer::AddValueSymbols(const MCExpr *Value) { 578067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer switch (Value->getKind()) { 588067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer case MCExpr::Target: llvm_unreachable("Can't handle target exprs yet!"); 598067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer case MCExpr::Constant: 608067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer break; 618067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 628067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer case MCExpr::Binary: { 638067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 648067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer AddValueSymbols(BE->getLHS()); 658067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer AddValueSymbols(BE->getRHS()); 668067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer break; 678067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer } 688067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 698067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer case MCExpr::SymbolRef: 708067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer Assembler->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 718067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer break; 728067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 738067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer case MCExpr::Unary: 748067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer AddValueSymbols(cast<MCUnaryExpr>(Value)->getSubExpr()); 758067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer break; 768067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer } 778067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 788067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer return Value; 798067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer} 808067adc271d7ccfcd28a238d73942b21a5e2bc62Michael J. Spencer 8189b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindolavoid MCObjectStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, 8289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola bool isPCRel, unsigned AddrSpace) { 836f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola assert(AddrSpace == 0 && "Address space must be 0!"); 846f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola MCDataFragment *DF = getOrCreateDataFragment(); 856f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola 866f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola // Avoid fixups when possible. 876f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola int64_t AbsValue; 88d076482ab7e672d1d65a43809695e8d0d3995203Rafael Espindola if (AddValueSymbols(Value)->EvaluateAsAbsolute(AbsValue, getAssembler())) { 892df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola EmitIntValue(AbsValue, Size, AddrSpace); 902df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola return; 916f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola } 922df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola DF->addFixup(MCFixup::Create(DF->getContents().size(), 932df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola AddValueSymbols(Value), 9489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola MCFixup::getKindForSize(Size, isPCRel))); 952df042cb32ecb8d2e1d499dfa27d5074c8b40e13Rafael Espindola DF->getContents().resize(DF->getContents().size() + Size, 0); 966f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola} 976f95023a7f27075011a6eb7b84e03732b00a785bRafael Espindola 98ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindolavoid MCObjectStreamer::EmitLabel(MCSymbol *Symbol) { 99ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola assert(!Symbol->isVariable() && "Cannot emit a variable symbol!"); 100ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola assert(CurSection && "Cannot emit before setting section!"); 101ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola 102ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola Symbol->setSection(*CurSection); 103ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola 104ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol); 105ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola 106ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola // FIXME: This is wasteful, we don't necessarily need to create a data 107ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola // fragment. Instead, we should mark the symbol as pointing into the data 108ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola // fragment if it exists, otherwise we should just queue the label and set its 109ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola // fragment pointer when we emit the next fragment. 110ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola MCDataFragment *F = getOrCreateDataFragment(); 111ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola assert(!SD.getFragment() && "Unexpected fragment on symbol data!"); 112ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola SD.setFragment(F); 113ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola SD.setOffset(F->getContents().size()); 114ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola} 115ea4afa91eb453323948588ad1e1706d842fb9007Rafael Espindola 1163ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindolavoid MCObjectStreamer::EmitULEB128Value(const MCExpr *Value, 1173ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola unsigned AddrSpace) { 118660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola int64_t IntValue; 119d076482ab7e672d1d65a43809695e8d0d3995203Rafael Espindola if (Value->EvaluateAsAbsolute(IntValue, getAssembler())) { 120660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola EmitULEB128IntValue(IntValue, AddrSpace); 121660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola return; 122660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola } 1233ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola new MCLEBFragment(*Value, false, getCurrentSectionData()); 1243ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola} 1253ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 1263ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindolavoid MCObjectStreamer::EmitSLEB128Value(const MCExpr *Value, 1273ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola unsigned AddrSpace) { 128660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola int64_t IntValue; 129d076482ab7e672d1d65a43809695e8d0d3995203Rafael Espindola if (Value->EvaluateAsAbsolute(IntValue, getAssembler())) { 130660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola EmitSLEB128IntValue(IntValue, AddrSpace); 131660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola return; 132660b5fc4d019bf22fbe14dfb81c5b59444fa3506Rafael Espindola } 1333ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola new MCLEBFragment(*Value, true, getCurrentSectionData()); 1343ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola} 1353ff57094a7d176a759ddb1e1668489d89064f56cRafael Espindola 136484291c27319668ad99cb87def000254357736fbRafael Espindolavoid MCObjectStreamer::EmitWeakReference(MCSymbol *Alias, 137484291c27319668ad99cb87def000254357736fbRafael Espindola const MCSymbol *Symbol) { 138484291c27319668ad99cb87def000254357736fbRafael Espindola report_fatal_error("This file format doesn't support weak aliases."); 139484291c27319668ad99cb87def000254357736fbRafael Espindola} 140484291c27319668ad99cb87def000254357736fbRafael Espindola 14183b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbarvoid MCObjectStreamer::SwitchSection(const MCSection *Section) { 14283b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar assert(Section && "Cannot switch to a null section!"); 14383b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar 14483b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar // If already in this section, then this is a noop. 14583b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar if (Section == CurSection) return; 14683b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar 1471674b0b0e4972b844833f253286cbf99a6e99d6eBenjamin Kramer PrevSection = CurSection; 14883b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar CurSection = Section; 14983b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar CurSectionData = &getAssembler().getOrCreateSectionData(*Section); 15083b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar} 15183b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar 152f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindolavoid MCObjectStreamer::EmitInstruction(const MCInst &Inst) { 153f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola // Scan for values. 154f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola for (unsigned i = Inst.getNumOperands(); i--; ) 155f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola if (Inst.getOperand(i).isExpr()) 156f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola AddValueSymbols(Inst.getOperand(i).getExpr()); 157f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola 158f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola getCurrentSectionData()->setHasInstructions(true); 159f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola 160f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola // Now that a machine instruction has been assembled into this section, make 161f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola // a line entry for any .loc directive that has been seen. 162f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola MCLineEntry::Make(this, getCurrentSection()); 163f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola 164f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola // If this instruction doesn't need relaxation, just emit it as data. 165f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola if (!getAssembler().getBackend().MayNeedRelaxation(Inst)) { 166f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola EmitInstToData(Inst); 167f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola return; 168f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola } 169f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola 170f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola // Otherwise, if we are relaxing everything, relax the instruction as much as 171f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola // possible and emit it as data. 172f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola if (getAssembler().getRelaxAll()) { 173f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola MCInst Relaxed; 174f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola getAssembler().getBackend().RelaxInstruction(Inst, Relaxed); 175f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola while (getAssembler().getBackend().MayNeedRelaxation(Relaxed)) 176f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola getAssembler().getBackend().RelaxInstruction(Relaxed, Relaxed); 177f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola EmitInstToData(Relaxed); 178f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola return; 179f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola } 180f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola 181f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola // Otherwise emit to a separate fragment. 182f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola EmitInstToFragment(Inst); 183f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola} 184f89671d994ba27e2816a7e49eb8bbc1b43d2a147Rafael Espindola 185dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindolavoid MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) { 186dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola MCInstFragment *IF = new MCInstFragment(Inst, getCurrentSectionData()); 187dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola 188dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola raw_svector_ostream VecOS(IF->getCode()); 189dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, IF->getFixups()); 190dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola} 191dedb045c3296c831962c4ae101531c38c273ba89Rafael Espindola 19232a006e606742b1c5401e49607e33717bb5441f0Rafael Espindolavoid MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta, 19332a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola const MCSymbol *LastLabel, 19432a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola const MCSymbol *Label) { 19532a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola if (!LastLabel) { 19689b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola int PointerSize = getContext().getTargetAsmInfo().getPointerSize(); 19732a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola EmitDwarfSetLineAddr(LineDelta, Label, PointerSize); 19832a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola return; 19932a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola } 20032a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; 20132a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola const MCExpr *LabelRef = 20232a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola MCSymbolRefExpr::Create(Label, Variant, getContext()); 20332a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola const MCExpr *LastLabelRef = 20432a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola MCSymbolRefExpr::Create(LastLabel, Variant, getContext()); 20532a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola const MCExpr *AddrDelta = 20632a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola MCBinaryExpr::Create(MCBinaryExpr::Sub, LabelRef, LastLabelRef, 20732a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola getContext()); 20832a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola int64_t Res; 209d076482ab7e672d1d65a43809695e8d0d3995203Rafael Espindola if (AddrDelta->EvaluateAsAbsolute(Res, getAssembler())) { 21032a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola MCDwarfLineAddr::Emit(this, LineDelta, Res); 21132a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola return; 21232a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola } 21332a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola new MCDwarfLineAddrFragment(LineDelta, *AddrDelta, getCurrentSectionData()); 21432a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola} 21532a006e606742b1c5401e49607e33717bb5441f0Rafael Espindola 216e23930543c0de0adcfec00cd18e9243ad812a167Rafael Espindolavoid MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset, 217e23930543c0de0adcfec00cd18e9243ad812a167Rafael Espindola unsigned char Value) { 218e23930543c0de0adcfec00cd18e9243ad812a167Rafael Espindola new MCOrgFragment(*Offset, Value, getCurrentSectionData()); 219e23930543c0de0adcfec00cd18e9243ad812a167Rafael Espindola} 220e23930543c0de0adcfec00cd18e9243ad812a167Rafael Espindola 22183b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbarvoid MCObjectStreamer::Finish() { 22289b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola // Dump out the dwarf file & directory tables and line tables. 22389b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola if (getContext().hasDwarfFiles()) 22489b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola MCDwarfFileTable::Emit(this); 22589b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola 22683b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar getAssembler().Finish(); 22783b467178a8295048f3ee7b44ff9c7ea244a96ccDaniel Dunbar} 228