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 #include "llvm/ADT/STLExtras.h" 12 #include "llvm/MC/MCAsmBackend.h" 13 #include "llvm/MC/MCAsmInfo.h" 14 #include "llvm/MC/MCAssembler.h" 15 #include "llvm/MC/MCCodeEmitter.h" 16 #include "llvm/MC/MCContext.h" 17 #include "llvm/MC/MCDwarf.h" 18 #include "llvm/MC/MCExpr.h" 19 #include "llvm/MC/MCObjectWriter.h" 20 #include "llvm/MC/MCSymbol.h" 21 #include "llvm/Support/ErrorHandling.h" 22 using namespace llvm; 23 24 MCObjectStreamer::MCObjectStreamer(StreamerKind Kind, MCContext &Context, 25 MCAsmBackend &TAB, raw_ostream &OS, 26 MCCodeEmitter *Emitter_) 27 : MCStreamer(Kind, Context), 28 Assembler(new MCAssembler(Context, TAB, *Emitter_, 29 *TAB.createObjectWriter(OS), OS)), 30 CurSectionData(0) {} 31 32 MCObjectStreamer::MCObjectStreamer(StreamerKind Kind, MCContext &Context, 33 MCAsmBackend &TAB, raw_ostream &OS, 34 MCCodeEmitter *Emitter_, 35 MCAssembler *_Assembler) 36 : MCStreamer(Kind, Context), Assembler(_Assembler), CurSectionData(0) {} 37 38 MCObjectStreamer::~MCObjectStreamer() { 39 delete &Assembler->getBackend(); 40 delete &Assembler->getEmitter(); 41 delete &Assembler->getWriter(); 42 delete Assembler; 43 } 44 45 void MCObjectStreamer::reset() { 46 if (Assembler) 47 Assembler->reset(); 48 CurSectionData = 0; 49 CurInsertionPoint = MCSectionData::iterator(); 50 MCStreamer::reset(); 51 } 52 53 MCFragment *MCObjectStreamer::getCurrentFragment() const { 54 assert(getCurrentSectionData() && "No current section!"); 55 56 if (CurInsertionPoint != getCurrentSectionData()->getFragmentList().begin()) 57 return prior(CurInsertionPoint); 58 59 return 0; 60 } 61 62 MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const { 63 MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment()); 64 // When bundling is enabled, we don't want to add data to a fragment that 65 // already has instructions (see MCELFStreamer::EmitInstToData for details) 66 if (!F || (Assembler->isBundlingEnabled() && F->hasInstructions())) { 67 F = new MCDataFragment(); 68 insert(F); 69 } 70 return F; 71 } 72 73 const MCExpr *MCObjectStreamer::AddValueSymbols(const MCExpr *Value) { 74 switch (Value->getKind()) { 75 case MCExpr::Target: 76 cast<MCTargetExpr>(Value)->AddValueSymbols(Assembler); 77 break; 78 79 case MCExpr::Constant: 80 break; 81 82 case MCExpr::Binary: { 83 const MCBinaryExpr *BE = cast<MCBinaryExpr>(Value); 84 AddValueSymbols(BE->getLHS()); 85 AddValueSymbols(BE->getRHS()); 86 break; 87 } 88 89 case MCExpr::SymbolRef: 90 Assembler->getOrCreateSymbolData(cast<MCSymbolRefExpr>(Value)->getSymbol()); 91 break; 92 93 case MCExpr::Unary: 94 AddValueSymbols(cast<MCUnaryExpr>(Value)->getSubExpr()); 95 break; 96 } 97 98 return Value; 99 } 100 101 void MCObjectStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size, 102 unsigned AddrSpace) { 103 assert(AddrSpace == 0 && "Address space must be 0!"); 104 MCDataFragment *DF = getOrCreateDataFragment(); 105 106 MCLineEntry::Make(this, getCurrentSection().first); 107 108 // Avoid fixups when possible. 109 int64_t AbsValue; 110 if (AddValueSymbols(Value)->EvaluateAsAbsolute(AbsValue, getAssembler())) { 111 EmitIntValue(AbsValue, Size, AddrSpace); 112 return; 113 } 114 DF->getFixups().push_back( 115 MCFixup::Create(DF->getContents().size(), Value, 116 MCFixup::getKindForSize(Size, false))); 117 DF->getContents().resize(DF->getContents().size() + Size, 0); 118 } 119 120 void MCObjectStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) { 121 RecordProcStart(Frame); 122 } 123 124 void MCObjectStreamer::EmitCFIEndProcImpl(MCDwarfFrameInfo &Frame) { 125 RecordProcEnd(Frame); 126 } 127 128 void MCObjectStreamer::EmitLabel(MCSymbol *Symbol) { 129 MCStreamer::EmitLabel(Symbol); 130 131 MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol); 132 133 // FIXME: This is wasteful, we don't necessarily need to create a data 134 // fragment. Instead, we should mark the symbol as pointing into the data 135 // fragment if it exists, otherwise we should just queue the label and set its 136 // fragment pointer when we emit the next fragment. 137 MCDataFragment *F = getOrCreateDataFragment(); 138 assert(!SD.getFragment() && "Unexpected fragment on symbol data!"); 139 SD.setFragment(F); 140 SD.setOffset(F->getContents().size()); 141 } 142 143 void MCObjectStreamer::EmitDebugLabel(MCSymbol *Symbol) { 144 EmitLabel(Symbol); 145 } 146 147 void MCObjectStreamer::EmitULEB128Value(const MCExpr *Value) { 148 int64_t IntValue; 149 if (Value->EvaluateAsAbsolute(IntValue, getAssembler())) { 150 EmitULEB128IntValue(IntValue); 151 return; 152 } 153 Value = ForceExpAbs(Value); 154 insert(new MCLEBFragment(*Value, false)); 155 } 156 157 void MCObjectStreamer::EmitSLEB128Value(const MCExpr *Value) { 158 int64_t IntValue; 159 if (Value->EvaluateAsAbsolute(IntValue, getAssembler())) { 160 EmitSLEB128IntValue(IntValue); 161 return; 162 } 163 Value = ForceExpAbs(Value); 164 insert(new MCLEBFragment(*Value, true)); 165 } 166 167 void MCObjectStreamer::EmitWeakReference(MCSymbol *Alias, 168 const MCSymbol *Symbol) { 169 report_fatal_error("This file format doesn't support weak aliases."); 170 } 171 172 void MCObjectStreamer::ChangeSection(const MCSection *Section, 173 const MCExpr *Subsection) { 174 assert(Section && "Cannot switch to a null section!"); 175 176 CurSectionData = &getAssembler().getOrCreateSectionData(*Section); 177 178 int64_t IntSubsection = 0; 179 if (Subsection && 180 !Subsection->EvaluateAsAbsolute(IntSubsection, getAssembler())) 181 report_fatal_error("Cannot evaluate subsection number"); 182 if (IntSubsection < 0 || IntSubsection > 8192) 183 report_fatal_error("Subsection number out of range"); 184 CurInsertionPoint = 185 CurSectionData->getSubsectionInsertionPoint(unsigned(IntSubsection)); 186 } 187 188 void MCObjectStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { 189 getAssembler().getOrCreateSymbolData(*Symbol); 190 Symbol->setVariableValue(AddValueSymbols(Value)); 191 } 192 193 void MCObjectStreamer::EmitInstruction(const MCInst &Inst) { 194 // Scan for values. 195 for (unsigned i = Inst.getNumOperands(); i--; ) 196 if (Inst.getOperand(i).isExpr()) 197 AddValueSymbols(Inst.getOperand(i).getExpr()); 198 199 MCSectionData *SD = getCurrentSectionData(); 200 SD->setHasInstructions(true); 201 202 // Now that a machine instruction has been assembled into this section, make 203 // a line entry for any .loc directive that has been seen. 204 MCLineEntry::Make(this, getCurrentSection().first); 205 206 // If this instruction doesn't need relaxation, just emit it as data. 207 MCAssembler &Assembler = getAssembler(); 208 if (!Assembler.getBackend().mayNeedRelaxation(Inst)) { 209 EmitInstToData(Inst); 210 return; 211 } 212 213 // Otherwise, relax and emit it as data if either: 214 // - The RelaxAll flag was passed 215 // - Bundling is enabled and this instruction is inside a bundle-locked 216 // group. We want to emit all such instructions into the same data 217 // fragment. 218 if (Assembler.getRelaxAll() || 219 (Assembler.isBundlingEnabled() && SD->isBundleLocked())) { 220 MCInst Relaxed; 221 getAssembler().getBackend().relaxInstruction(Inst, Relaxed); 222 while (getAssembler().getBackend().mayNeedRelaxation(Relaxed)) 223 getAssembler().getBackend().relaxInstruction(Relaxed, Relaxed); 224 EmitInstToData(Relaxed); 225 return; 226 } 227 228 // Otherwise emit to a separate fragment. 229 EmitInstToFragment(Inst); 230 } 231 232 void MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) { 233 // Always create a new, separate fragment here, because its size can change 234 // during relaxation. 235 MCRelaxableFragment *IF = new MCRelaxableFragment(Inst); 236 insert(IF); 237 238 SmallString<128> Code; 239 raw_svector_ostream VecOS(Code); 240 getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, IF->getFixups()); 241 VecOS.flush(); 242 IF->getContents().append(Code.begin(), Code.end()); 243 } 244 245 #ifndef NDEBUG 246 static const char *BundlingNotImplementedMsg = 247 "Aligned bundling is not implemented for this object format"; 248 #endif 249 250 void MCObjectStreamer::EmitBundleAlignMode(unsigned AlignPow2) { 251 llvm_unreachable(BundlingNotImplementedMsg); 252 } 253 254 void MCObjectStreamer::EmitBundleLock(bool AlignToEnd) { 255 llvm_unreachable(BundlingNotImplementedMsg); 256 } 257 258 void MCObjectStreamer::EmitBundleUnlock() { 259 llvm_unreachable(BundlingNotImplementedMsg); 260 } 261 262 void MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta, 263 const MCSymbol *LastLabel, 264 const MCSymbol *Label, 265 unsigned PointerSize) { 266 if (!LastLabel) { 267 EmitDwarfSetLineAddr(LineDelta, Label, PointerSize); 268 return; 269 } 270 const MCExpr *AddrDelta = BuildSymbolDiff(getContext(), Label, LastLabel); 271 int64_t Res; 272 if (AddrDelta->EvaluateAsAbsolute(Res, getAssembler())) { 273 MCDwarfLineAddr::Emit(this, LineDelta, Res); 274 return; 275 } 276 AddrDelta = ForceExpAbs(AddrDelta); 277 insert(new MCDwarfLineAddrFragment(LineDelta, *AddrDelta)); 278 } 279 280 void MCObjectStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel, 281 const MCSymbol *Label) { 282 const MCExpr *AddrDelta = BuildSymbolDiff(getContext(), Label, LastLabel); 283 int64_t Res; 284 if (AddrDelta->EvaluateAsAbsolute(Res, getAssembler())) { 285 MCDwarfFrameEmitter::EmitAdvanceLoc(*this, Res); 286 return; 287 } 288 AddrDelta = ForceExpAbs(AddrDelta); 289 insert(new MCDwarfCallFrameFragment(*AddrDelta)); 290 } 291 292 void MCObjectStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) { 293 assert(AddrSpace == 0 && "Address space must be 0!"); 294 getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end()); 295 } 296 297 void MCObjectStreamer::EmitValueToAlignment(unsigned ByteAlignment, 298 int64_t Value, 299 unsigned ValueSize, 300 unsigned MaxBytesToEmit) { 301 if (MaxBytesToEmit == 0) 302 MaxBytesToEmit = ByteAlignment; 303 insert(new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit)); 304 305 // Update the maximum alignment on the current section if necessary. 306 if (ByteAlignment > getCurrentSectionData()->getAlignment()) 307 getCurrentSectionData()->setAlignment(ByteAlignment); 308 } 309 310 void MCObjectStreamer::EmitCodeAlignment(unsigned ByteAlignment, 311 unsigned MaxBytesToEmit) { 312 EmitValueToAlignment(ByteAlignment, 0, 1, MaxBytesToEmit); 313 cast<MCAlignFragment>(getCurrentFragment())->setEmitNops(true); 314 } 315 316 bool MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset, 317 unsigned char Value) { 318 int64_t Res; 319 if (Offset->EvaluateAsAbsolute(Res, getAssembler())) { 320 insert(new MCOrgFragment(*Offset, Value)); 321 return false; 322 } 323 324 MCSymbol *CurrentPos = getContext().CreateTempSymbol(); 325 EmitLabel(CurrentPos); 326 MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; 327 const MCExpr *Ref = 328 MCSymbolRefExpr::Create(CurrentPos, Variant, getContext()); 329 const MCExpr *Delta = 330 MCBinaryExpr::Create(MCBinaryExpr::Sub, Offset, Ref, getContext()); 331 332 if (!Delta->EvaluateAsAbsolute(Res, getAssembler())) 333 return true; 334 EmitFill(Res, Value); 335 return false; 336 } 337 338 // Associate GPRel32 fixup with data and resize data area 339 void MCObjectStreamer::EmitGPRel32Value(const MCExpr *Value) { 340 MCDataFragment *DF = getOrCreateDataFragment(); 341 342 DF->getFixups().push_back(MCFixup::Create(DF->getContents().size(), 343 Value, FK_GPRel_4)); 344 DF->getContents().resize(DF->getContents().size() + 4, 0); 345 } 346 347 // Associate GPRel32 fixup with data and resize data area 348 void MCObjectStreamer::EmitGPRel64Value(const MCExpr *Value) { 349 MCDataFragment *DF = getOrCreateDataFragment(); 350 351 DF->getFixups().push_back(MCFixup::Create(DF->getContents().size(), 352 Value, FK_GPRel_4)); 353 DF->getContents().resize(DF->getContents().size() + 8, 0); 354 } 355 356 void MCObjectStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue, 357 unsigned AddrSpace) { 358 assert(AddrSpace == 0 && "Address space must be 0!"); 359 // FIXME: A MCFillFragment would be more memory efficient but MCExpr has 360 // problems evaluating expressions across multiple fragments. 361 getOrCreateDataFragment()->getContents().append(NumBytes, FillValue); 362 } 363 364 void MCObjectStreamer::FinishImpl() { 365 // Dump out the dwarf file & directory tables and line tables. 366 const MCSymbol *LineSectionSymbol = NULL; 367 if (getContext().hasDwarfFiles()) 368 LineSectionSymbol = MCDwarfFileTable::Emit(this); 369 370 // If we are generating dwarf for assembly source files dump out the sections. 371 if (getContext().getGenDwarfForAssembly()) 372 MCGenDwarfInfo::Emit(this, LineSectionSymbol); 373 374 getAssembler().Finish(); 375 } 376