1 //===-- MCMachOStreamer.cpp - MachO Streamer ------------------------------===// 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/MCStreamer.h" 11 #include "llvm/ADT/DenseMap.h" 12 #include "llvm/ADT/SmallVector.h" 13 #include "llvm/MC/MCAsmBackend.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/MCInst.h" 20 #include "llvm/MC/MCLinkerOptimizationHint.h" 21 #include "llvm/MC/MCObjectFileInfo.h" 22 #include "llvm/MC/MCObjectStreamer.h" 23 #include "llvm/MC/MCSection.h" 24 #include "llvm/MC/MCSectionMachO.h" 25 #include "llvm/MC/MCSymbolMachO.h" 26 #include "llvm/MC/MCValue.h" 27 #include "llvm/Support/Dwarf.h" 28 #include "llvm/Support/ErrorHandling.h" 29 #include "llvm/Support/TargetRegistry.h" 30 #include "llvm/Support/raw_ostream.h" 31 32 using namespace llvm; 33 34 namespace { 35 36 class MCMachOStreamer : public MCObjectStreamer { 37 private: 38 /// LabelSections - true if each section change should emit a linker local 39 /// label for use in relocations for assembler local references. Obviates the 40 /// need for local relocations. False by default. 41 bool LabelSections; 42 43 bool DWARFMustBeAtTheEnd; 44 bool CreatedADWARFSection; 45 46 /// HasSectionLabel - map of which sections have already had a non-local 47 /// label emitted to them. Used so we don't emit extraneous linker local 48 /// labels in the middle of the section. 49 DenseMap<const MCSection*, bool> HasSectionLabel; 50 51 void EmitInstToData(const MCInst &Inst, const MCSubtargetInfo &STI) override; 52 53 void EmitDataRegion(DataRegionData::KindTy Kind); 54 void EmitDataRegionEnd(); 55 56 public: 57 MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB, raw_pwrite_stream &OS, 58 MCCodeEmitter *Emitter, bool DWARFMustBeAtTheEnd, bool label) 59 : MCObjectStreamer(Context, MAB, OS, Emitter), LabelSections(label), 60 DWARFMustBeAtTheEnd(DWARFMustBeAtTheEnd), CreatedADWARFSection(false) {} 61 62 /// state management 63 void reset() override { 64 CreatedADWARFSection = false; 65 HasSectionLabel.clear(); 66 MCObjectStreamer::reset(); 67 } 68 69 /// @name MCStreamer Interface 70 /// @{ 71 72 void ChangeSection(MCSection *Sect, const MCExpr *Subsect) override; 73 void EmitLabel(MCSymbol *Symbol) override; 74 void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; 75 void EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol) override; 76 void EmitAssemblerFlag(MCAssemblerFlag Flag) override; 77 void EmitLinkerOptions(ArrayRef<std::string> Options) override; 78 void EmitDataRegion(MCDataRegionType Kind) override; 79 void EmitVersionMin(MCVersionMinType Kind, unsigned Major, 80 unsigned Minor, unsigned Update) override; 81 void EmitThumbFunc(MCSymbol *Func) override; 82 bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override; 83 void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; 84 void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 85 unsigned ByteAlignment) override; 86 void BeginCOFFSymbolDef(const MCSymbol *Symbol) override { 87 llvm_unreachable("macho doesn't support this directive"); 88 } 89 void EmitCOFFSymbolStorageClass(int StorageClass) override { 90 llvm_unreachable("macho doesn't support this directive"); 91 } 92 void EmitCOFFSymbolType(int Type) override { 93 llvm_unreachable("macho doesn't support this directive"); 94 } 95 void EndCOFFSymbolDef() override { 96 llvm_unreachable("macho doesn't support this directive"); 97 } 98 void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 99 unsigned ByteAlignment) override; 100 void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr, 101 uint64_t Size = 0, unsigned ByteAlignment = 0) override; 102 void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, 103 unsigned ByteAlignment = 0) override; 104 105 void EmitFileDirective(StringRef Filename) override { 106 // FIXME: Just ignore the .file; it isn't important enough to fail the 107 // entire assembly. 108 109 // report_fatal_error("unsupported directive: '.file'"); 110 } 111 112 void EmitIdent(StringRef IdentString) override { 113 llvm_unreachable("macho doesn't support this directive"); 114 } 115 116 void EmitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args) override { 117 getAssembler().getLOHContainer().addDirective(Kind, Args); 118 } 119 120 void FinishImpl() override; 121 }; 122 123 } // end anonymous namespace. 124 125 static bool canGoAfterDWARF(const MCSectionMachO &MSec) { 126 // These sections are created by the assembler itself after the end of 127 // the .s file. 128 StringRef SegName = MSec.getSegmentName(); 129 StringRef SecName = MSec.getSectionName(); 130 131 if (SegName == "__LD" && SecName == "__compact_unwind") 132 return true; 133 134 if (SegName == "__IMPORT") { 135 if (SecName == "__jump_table") 136 return true; 137 138 if (SecName == "__pointers") 139 return true; 140 } 141 142 if (SegName == "__TEXT" && SecName == "__eh_frame") 143 return true; 144 145 if (SegName == "__DATA" && SecName == "__nl_symbol_ptr") 146 return true; 147 148 return false; 149 } 150 151 void MCMachOStreamer::ChangeSection(MCSection *Section, 152 const MCExpr *Subsection) { 153 // Change the section normally. 154 bool Created = MCObjectStreamer::changeSectionImpl(Section, Subsection); 155 const MCSectionMachO &MSec = *cast<MCSectionMachO>(Section); 156 StringRef SegName = MSec.getSegmentName(); 157 if (SegName == "__DWARF") 158 CreatedADWARFSection = true; 159 else if (Created && DWARFMustBeAtTheEnd && !canGoAfterDWARF(MSec)) 160 assert(!CreatedADWARFSection && "Creating regular section after DWARF"); 161 162 // Output a linker-local symbol so we don't need section-relative local 163 // relocations. The linker hates us when we do that. 164 if (LabelSections && !HasSectionLabel[Section] && 165 !Section->getBeginSymbol()) { 166 MCSymbol *Label = getContext().createLinkerPrivateTempSymbol(); 167 Section->setBeginSymbol(Label); 168 HasSectionLabel[Section] = true; 169 } 170 } 171 172 void MCMachOStreamer::EmitEHSymAttributes(const MCSymbol *Symbol, 173 MCSymbol *EHSymbol) { 174 getAssembler().registerSymbol(*Symbol); 175 if (Symbol->isExternal()) 176 EmitSymbolAttribute(EHSymbol, MCSA_Global); 177 if (cast<MCSymbolMachO>(Symbol)->isWeakDefinition()) 178 EmitSymbolAttribute(EHSymbol, MCSA_WeakDefinition); 179 if (Symbol->isPrivateExtern()) 180 EmitSymbolAttribute(EHSymbol, MCSA_PrivateExtern); 181 } 182 183 void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) { 184 assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); 185 186 // We have to create a new fragment if this is an atom defining symbol, 187 // fragments cannot span atoms. 188 if (getAssembler().isSymbolLinkerVisible(*Symbol)) 189 insert(new MCDataFragment()); 190 191 MCObjectStreamer::EmitLabel(Symbol); 192 193 // This causes the reference type flag to be cleared. Darwin 'as' was "trying" 194 // to clear the weak reference and weak definition bits too, but the 195 // implementation was buggy. For now we just try to match 'as', for 196 // diffability. 197 // 198 // FIXME: Cleanup this code, these bits should be emitted based on semantic 199 // properties, not on the order of definition, etc. 200 cast<MCSymbolMachO>(Symbol)->clearReferenceType(); 201 } 202 203 void MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { 204 MCValue Res; 205 206 if (Value->evaluateAsRelocatable(Res, nullptr, nullptr)) { 207 if (const MCSymbolRefExpr *SymAExpr = Res.getSymA()) { 208 const MCSymbol &SymA = SymAExpr->getSymbol(); 209 if (!Res.getSymB() && (SymA.getName() == "" || Res.getConstant() != 0)) 210 cast<MCSymbolMachO>(Symbol)->setAltEntry(); 211 } 212 } 213 MCObjectStreamer::EmitAssignment(Symbol, Value); 214 } 215 216 void MCMachOStreamer::EmitDataRegion(DataRegionData::KindTy Kind) { 217 // Create a temporary label to mark the start of the data region. 218 MCSymbol *Start = getContext().createTempSymbol(); 219 EmitLabel(Start); 220 // Record the region for the object writer to use. 221 DataRegionData Data = { Kind, Start, nullptr }; 222 std::vector<DataRegionData> &Regions = getAssembler().getDataRegions(); 223 Regions.push_back(Data); 224 } 225 226 void MCMachOStreamer::EmitDataRegionEnd() { 227 std::vector<DataRegionData> &Regions = getAssembler().getDataRegions(); 228 assert(!Regions.empty() && "Mismatched .end_data_region!"); 229 DataRegionData &Data = Regions.back(); 230 assert(!Data.End && "Mismatched .end_data_region!"); 231 // Create a temporary label to mark the end of the data region. 232 Data.End = getContext().createTempSymbol(); 233 EmitLabel(Data.End); 234 } 235 236 void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { 237 // Let the target do whatever target specific stuff it needs to do. 238 getAssembler().getBackend().handleAssemblerFlag(Flag); 239 // Do any generic stuff we need to do. 240 switch (Flag) { 241 case MCAF_SyntaxUnified: return; // no-op here. 242 case MCAF_Code16: return; // Change parsing mode; no-op here. 243 case MCAF_Code32: return; // Change parsing mode; no-op here. 244 case MCAF_Code64: return; // Change parsing mode; no-op here. 245 case MCAF_SubsectionsViaSymbols: 246 getAssembler().setSubsectionsViaSymbols(true); 247 return; 248 } 249 } 250 251 void MCMachOStreamer::EmitLinkerOptions(ArrayRef<std::string> Options) { 252 getAssembler().getLinkerOptions().push_back(Options); 253 } 254 255 void MCMachOStreamer::EmitDataRegion(MCDataRegionType Kind) { 256 switch (Kind) { 257 case MCDR_DataRegion: 258 EmitDataRegion(DataRegionData::Data); 259 return; 260 case MCDR_DataRegionJT8: 261 EmitDataRegion(DataRegionData::JumpTable8); 262 return; 263 case MCDR_DataRegionJT16: 264 EmitDataRegion(DataRegionData::JumpTable16); 265 return; 266 case MCDR_DataRegionJT32: 267 EmitDataRegion(DataRegionData::JumpTable32); 268 return; 269 case MCDR_DataRegionEnd: 270 EmitDataRegionEnd(); 271 return; 272 } 273 } 274 275 void MCMachOStreamer::EmitVersionMin(MCVersionMinType Kind, unsigned Major, 276 unsigned Minor, unsigned Update) { 277 getAssembler().setVersionMinInfo(Kind, Major, Minor, Update); 278 } 279 280 void MCMachOStreamer::EmitThumbFunc(MCSymbol *Symbol) { 281 // Remember that the function is a thumb function. Fixup and relocation 282 // values will need adjusted. 283 getAssembler().setIsThumbFunc(Symbol); 284 cast<MCSymbolMachO>(Symbol)->setThumbFunc(); 285 } 286 287 bool MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Sym, 288 MCSymbolAttr Attribute) { 289 MCSymbolMachO *Symbol = cast<MCSymbolMachO>(Sym); 290 291 // Indirect symbols are handled differently, to match how 'as' handles 292 // them. This makes writing matching .o files easier. 293 if (Attribute == MCSA_IndirectSymbol) { 294 // Note that we intentionally cannot use the symbol data here; this is 295 // important for matching the string table that 'as' generates. 296 IndirectSymbolData ISD; 297 ISD.Symbol = Symbol; 298 ISD.Section = getCurrentSectionOnly(); 299 getAssembler().getIndirectSymbols().push_back(ISD); 300 return true; 301 } 302 303 // Adding a symbol attribute always introduces the symbol, note that an 304 // important side effect of calling registerSymbol here is to register 305 // the symbol with the assembler. 306 getAssembler().registerSymbol(*Symbol); 307 308 // The implementation of symbol attributes is designed to match 'as', but it 309 // leaves much to desired. It doesn't really make sense to arbitrarily add and 310 // remove flags, but 'as' allows this (in particular, see .desc). 311 // 312 // In the future it might be worth trying to make these operations more well 313 // defined. 314 switch (Attribute) { 315 case MCSA_Invalid: 316 case MCSA_ELF_TypeFunction: 317 case MCSA_ELF_TypeIndFunction: 318 case MCSA_ELF_TypeObject: 319 case MCSA_ELF_TypeTLS: 320 case MCSA_ELF_TypeCommon: 321 case MCSA_ELF_TypeNoType: 322 case MCSA_ELF_TypeGnuUniqueObject: 323 case MCSA_Hidden: 324 case MCSA_IndirectSymbol: 325 case MCSA_Internal: 326 case MCSA_Protected: 327 case MCSA_Weak: 328 case MCSA_Local: 329 return false; 330 331 case MCSA_Global: 332 Symbol->setExternal(true); 333 // This effectively clears the undefined lazy bit, in Darwin 'as', although 334 // it isn't very consistent because it implements this as part of symbol 335 // lookup. 336 // 337 // FIXME: Cleanup this code, these bits should be emitted based on semantic 338 // properties, not on the order of definition, etc. 339 Symbol->setReferenceTypeUndefinedLazy(false); 340 break; 341 342 case MCSA_LazyReference: 343 // FIXME: This requires -dynamic. 344 Symbol->setNoDeadStrip(); 345 if (Symbol->isUndefined()) 346 Symbol->setReferenceTypeUndefinedLazy(true); 347 break; 348 349 // Since .reference sets the no dead strip bit, it is equivalent to 350 // .no_dead_strip in practice. 351 case MCSA_Reference: 352 case MCSA_NoDeadStrip: 353 Symbol->setNoDeadStrip(); 354 break; 355 356 case MCSA_SymbolResolver: 357 Symbol->setSymbolResolver(); 358 break; 359 360 case MCSA_AltEntry: 361 Symbol->setAltEntry(); 362 break; 363 364 case MCSA_PrivateExtern: 365 Symbol->setExternal(true); 366 Symbol->setPrivateExtern(true); 367 break; 368 369 case MCSA_WeakReference: 370 // FIXME: This requires -dynamic. 371 if (Symbol->isUndefined()) 372 Symbol->setWeakReference(); 373 break; 374 375 case MCSA_WeakDefinition: 376 // FIXME: 'as' enforces that this is defined and global. The manual claims 377 // it has to be in a coalesced section, but this isn't enforced. 378 Symbol->setWeakDefinition(); 379 break; 380 381 case MCSA_WeakDefAutoPrivate: 382 Symbol->setWeakDefinition(); 383 Symbol->setWeakReference(); 384 break; 385 } 386 387 return true; 388 } 389 390 void MCMachOStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { 391 // Encode the 'desc' value into the lowest implementation defined bits. 392 getAssembler().registerSymbol(*Symbol); 393 cast<MCSymbolMachO>(Symbol)->setDesc(DescValue); 394 } 395 396 void MCMachOStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 397 unsigned ByteAlignment) { 398 // FIXME: Darwin 'as' does appear to allow redef of a .comm by itself. 399 assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); 400 401 getAssembler().registerSymbol(*Symbol); 402 Symbol->setExternal(true); 403 Symbol->setCommon(Size, ByteAlignment); 404 } 405 406 void MCMachOStreamer::EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 407 unsigned ByteAlignment) { 408 // '.lcomm' is equivalent to '.zerofill'. 409 return EmitZerofill(getContext().getObjectFileInfo()->getDataBSSSection(), 410 Symbol, Size, ByteAlignment); 411 } 412 413 void MCMachOStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, 414 uint64_t Size, unsigned ByteAlignment) { 415 getAssembler().registerSection(*Section); 416 417 // The symbol may not be present, which only creates the section. 418 if (!Symbol) 419 return; 420 421 // On darwin all virtual sections have zerofill type. 422 assert(Section->isVirtualSection() && "Section does not have zerofill type!"); 423 424 assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); 425 426 getAssembler().registerSymbol(*Symbol); 427 428 // Emit an align fragment if necessary. 429 if (ByteAlignment != 1) 430 new MCAlignFragment(ByteAlignment, 0, 0, ByteAlignment, Section); 431 432 MCFragment *F = new MCFillFragment(0, Size, Section); 433 Symbol->setFragment(F); 434 435 // Update the maximum alignment on the zero fill section if necessary. 436 if (ByteAlignment > Section->getAlignment()) 437 Section->setAlignment(ByteAlignment); 438 } 439 440 // This should always be called with the thread local bss section. Like the 441 // .zerofill directive this doesn't actually switch sections on us. 442 void MCMachOStreamer::EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, 443 uint64_t Size, unsigned ByteAlignment) { 444 EmitZerofill(Section, Symbol, Size, ByteAlignment); 445 } 446 447 void MCMachOStreamer::EmitInstToData(const MCInst &Inst, 448 const MCSubtargetInfo &STI) { 449 MCDataFragment *DF = getOrCreateDataFragment(); 450 451 SmallVector<MCFixup, 4> Fixups; 452 SmallString<256> Code; 453 raw_svector_ostream VecOS(Code); 454 getAssembler().getEmitter().encodeInstruction(Inst, VecOS, Fixups, STI); 455 456 // Add the fixups and data. 457 for (MCFixup &Fixup : Fixups) { 458 Fixup.setOffset(Fixup.getOffset() + DF->getContents().size()); 459 DF->getFixups().push_back(Fixup); 460 } 461 DF->getContents().append(Code.begin(), Code.end()); 462 } 463 464 void MCMachOStreamer::FinishImpl() { 465 EmitFrames(&getAssembler().getBackend()); 466 467 // We have to set the fragment atom associations so we can relax properly for 468 // Mach-O. 469 470 // First, scan the symbol table to build a lookup table from fragments to 471 // defining symbols. 472 DenseMap<const MCFragment *, const MCSymbol *> DefiningSymbolMap; 473 for (const MCSymbol &Symbol : getAssembler().symbols()) { 474 if (getAssembler().isSymbolLinkerVisible(Symbol) && Symbol.isInSection() && 475 !Symbol.isVariable()) { 476 // An atom defining symbol should never be internal to a fragment. 477 assert(Symbol.getOffset() == 0 && 478 "Invalid offset in atom defining symbol!"); 479 DefiningSymbolMap[Symbol.getFragment()] = &Symbol; 480 } 481 } 482 483 // Set the fragment atom associations by tracking the last seen atom defining 484 // symbol. 485 for (MCSection &Sec : getAssembler()) { 486 const MCSymbol *CurrentAtom = nullptr; 487 for (MCFragment &Frag : Sec) { 488 if (const MCSymbol *Symbol = DefiningSymbolMap.lookup(&Frag)) 489 CurrentAtom = Symbol; 490 Frag.setAtom(CurrentAtom); 491 } 492 } 493 494 this->MCObjectStreamer::FinishImpl(); 495 } 496 497 MCStreamer *llvm::createMachOStreamer(MCContext &Context, MCAsmBackend &MAB, 498 raw_pwrite_stream &OS, MCCodeEmitter *CE, 499 bool RelaxAll, bool DWARFMustBeAtTheEnd, 500 bool LabelSections) { 501 MCMachOStreamer *S = new MCMachOStreamer(Context, MAB, OS, CE, 502 DWARFMustBeAtTheEnd, LabelSections); 503 const Triple &TT = Context.getObjectFileInfo()->getTargetTriple(); 504 if (TT.isOSDarwin()) { 505 unsigned Major, Minor, Update; 506 TT.getOSVersion(Major, Minor, Update); 507 // If there is a version specified, Major will be non-zero. 508 if (Major) { 509 MCVersionMinType VersionType; 510 if (TT.isWatchOS()) 511 VersionType = MCVM_WatchOSVersionMin; 512 else if (TT.isTvOS()) 513 VersionType = MCVM_TvOSVersionMin; 514 else if (TT.isMacOSX()) 515 VersionType = MCVM_OSXVersionMin; 516 else { 517 assert(TT.isiOS() && "Must only be iOS platform left"); 518 VersionType = MCVM_IOSVersionMin; 519 } 520 S->EmitVersionMin(VersionType, Major, Minor, Update); 521 } 522 } 523 if (RelaxAll) 524 S->getAssembler().setRelaxAll(true); 525 return S; 526 } 527