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