| //===- MCAsmInfoDarwin.cpp - Darwin asm properties ------------------------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file defines target asm properties related what form asm statements | 
 | // should take in general on Darwin-based targets | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "llvm/MC/MCAsmInfoDarwin.h" | 
 | #include "llvm/BinaryFormat/MachO.h" | 
 | #include "llvm/MC/MCDirectives.h" | 
 | #include "llvm/MC/MCSectionMachO.h" | 
 |  | 
 | using namespace llvm; | 
 |  | 
 | bool MCAsmInfoDarwin::isSectionAtomizableBySymbols( | 
 |     const MCSection &Section) const { | 
 |   const MCSectionMachO &SMO = static_cast<const MCSectionMachO &>(Section); | 
 |  | 
 |   // Sections holding 1 byte strings are atomized based on the data they | 
 |   // contain. | 
 |   // Sections holding 2 byte strings require symbols in order to be atomized. | 
 |   // There is no dedicated section for 4 byte strings. | 
 |   if (SMO.getType() == MachO::S_CSTRING_LITERALS) | 
 |     return false; | 
 |  | 
 |   if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__cfstring") | 
 |     return false; | 
 |  | 
 |   if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__objc_classrefs") | 
 |     return false; | 
 |  | 
 |   switch (SMO.getType()) { | 
 |   default: | 
 |     return true; | 
 |  | 
 |   // These sections are atomized at the element boundaries without using | 
 |   // symbols. | 
 |   case MachO::S_4BYTE_LITERALS: | 
 |   case MachO::S_8BYTE_LITERALS: | 
 |   case MachO::S_16BYTE_LITERALS: | 
 |   case MachO::S_LITERAL_POINTERS: | 
 |   case MachO::S_NON_LAZY_SYMBOL_POINTERS: | 
 |   case MachO::S_LAZY_SYMBOL_POINTERS: | 
 |   case MachO::S_THREAD_LOCAL_VARIABLE_POINTERS: | 
 |   case MachO::S_MOD_INIT_FUNC_POINTERS: | 
 |   case MachO::S_MOD_TERM_FUNC_POINTERS: | 
 |   case MachO::S_INTERPOSING: | 
 |     return false; | 
 |   } | 
 | } | 
 |  | 
 | MCAsmInfoDarwin::MCAsmInfoDarwin() { | 
 |   // Common settings for all Darwin targets. | 
 |   // Syntax: | 
 |   LinkerPrivateGlobalPrefix = "l"; | 
 |   HasSingleParameterDotFile = false; | 
 |   HasSubsectionsViaSymbols = true; | 
 |  | 
 |   AlignmentIsInBytes = false; | 
 |   COMMDirectiveAlignmentIsInBytes = false; | 
 |   LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment; | 
 |   InlineAsmStart = " InlineAsm Start"; | 
 |   InlineAsmEnd = " InlineAsm End"; | 
 |  | 
 |   // Directives: | 
 |   HasWeakDefDirective = true; | 
 |   HasWeakDefCanBeHiddenDirective = true; | 
 |   WeakRefDirective = "\t.weak_reference "; | 
 |   ZeroDirective = "\t.space\t";  // ".space N" emits N zeros. | 
 |   HasMachoZeroFillDirective = true;  // Uses .zerofill | 
 |   HasMachoTBSSDirective = true; // Uses .tbss | 
 |  | 
 |   // FIXME: Change this once MC is the system assembler. | 
 |   HasAggressiveSymbolFolding = false; | 
 |  | 
 |   HiddenVisibilityAttr = MCSA_PrivateExtern; | 
 |   HiddenDeclarationVisibilityAttr = MCSA_Invalid; | 
 |  | 
 |   // Doesn't support protected visibility. | 
 |   ProtectedVisibilityAttr = MCSA_Invalid; | 
 |  | 
 |   HasDotTypeDotSizeDirective = false; | 
 |   HasNoDeadStrip = true; | 
 |   HasAltEntry = true; | 
 |  | 
 |   DwarfUsesRelocationsAcrossSections = false; | 
 |   SetDirectiveSuppressesReloc = true; | 
 | } |