1 //===- MCAsmInfoDarwin.cpp - Darwin asm properties ------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines target asm properties related what form asm statements 10 // should take in general on Darwin-based targets 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/MC/MCAsmInfoDarwin.h" 15 #include "llvm/BinaryFormat/MachO.h" 16 #include "llvm/MC/MCDirectives.h" 17 #include "llvm/MC/MCSectionMachO.h" 18 19 using namespace llvm; 20 21 bool MCAsmInfoDarwin::isSectionAtomizableBySymbols( 22 const MCSection &Section) const { 23 const MCSectionMachO &SMO = static_cast<const MCSectionMachO &>(Section); 24 25 // Sections holding 1 byte strings are atomized based on the data they 26 // contain. 27 // Sections holding 2 byte strings require symbols in order to be atomized. 28 // There is no dedicated section for 4 byte strings. 29 if (SMO.getType() == MachO::S_CSTRING_LITERALS) 30 return false; 31 32 if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__cfstring") 33 return false; 34 35 if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__objc_classrefs") 36 return false; 37 38 switch (SMO.getType()) { 39 default: 40 return true; 41 42 // These sections are atomized at the element boundaries without using 43 // symbols. 44 case MachO::S_4BYTE_LITERALS: 45 case MachO::S_8BYTE_LITERALS: 46 case MachO::S_16BYTE_LITERALS: 47 case MachO::S_LITERAL_POINTERS: 48 case MachO::S_NON_LAZY_SYMBOL_POINTERS: 49 case MachO::S_LAZY_SYMBOL_POINTERS: 50 case MachO::S_THREAD_LOCAL_VARIABLE_POINTERS: 51 case MachO::S_MOD_INIT_FUNC_POINTERS: 52 case MachO::S_MOD_TERM_FUNC_POINTERS: 53 case MachO::S_INTERPOSING: 54 return false; 55 } 56 } 57 58 MCAsmInfoDarwin::MCAsmInfoDarwin() { 59 // Common settings for all Darwin targets. 60 // Syntax: 61 LinkerPrivateGlobalPrefix = "l"; 62 HasSingleParameterDotFile = false; 63 HasSubsectionsViaSymbols = true; 64 65 AlignmentIsInBytes = false; 66 COMMDirectiveAlignmentIsInBytes = false; 67 LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment; 68 InlineAsmStart = " InlineAsm Start"; 69 InlineAsmEnd = " InlineAsm End"; 70 71 // Directives: 72 HasWeakDefDirective = true; 73 HasWeakDefCanBeHiddenDirective = true; 74 WeakRefDirective = "\t.weak_reference "; 75 ZeroDirective = "\t.space\t"; // ".space N" emits N zeros. 76 HasMachoZeroFillDirective = true; // Uses .zerofill 77 HasMachoTBSSDirective = true; // Uses .tbss 78 79 // FIXME: Change this once MC is the system assembler. 80 HasAggressiveSymbolFolding = false; 81 82 HiddenVisibilityAttr = MCSA_PrivateExtern; 83 HiddenDeclarationVisibilityAttr = MCSA_Invalid; 84 85 // Doesn't support protected visibility. 86 ProtectedVisibilityAttr = MCSA_Invalid; 87 88 HasDotTypeDotSizeDirective = false; 89 HasNoDeadStrip = true; 90 HasAltEntry = true; 91 92 DwarfUsesRelocationsAcrossSections = false; 93 SetDirectiveSuppressesReloc = true; 94 } 95