MCObjectStreamer.cpp revision feb7ba3d9abfa1eb89f6da93c51649baaa931ab8
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;
882d8e3e741f49baadfc72403de9c4b362a07af8d9Daniel Dunbar  if (AddValueSymbols(Value)->EvaluateAsAbsolute(AbsValue)) {
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;
1192d8e3e741f49baadfc72403de9c4b362a07af8d9Daniel Dunbar  if (Value->EvaluateAsAbsolute(IntValue)) {
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;
1292d8e3e741f49baadfc72403de9c4b362a07af8d9Daniel Dunbar  if (Value->EvaluateAsAbsolute(IntValue)) {
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;
2092d8e3e741f49baadfc72403de9c4b362a07af8d9Daniel Dunbar  if (AddrDelta->EvaluateAsAbsolute(Res)) {
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