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