10b57cec5SDimitry Andric //===- MCAsmInfoDarwin.cpp - Darwin asm properties ------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file defines target asm properties related what form asm statements 100b57cec5SDimitry Andric // should take in general on Darwin-based targets 110b57cec5SDimitry Andric // 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "llvm/MC/MCAsmInfoDarwin.h" 150b57cec5SDimitry Andric #include "llvm/BinaryFormat/MachO.h" 160b57cec5SDimitry Andric #include "llvm/MC/MCDirectives.h" 170b57cec5SDimitry Andric #include "llvm/MC/MCSectionMachO.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric using namespace llvm; 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric bool MCAsmInfoDarwin::isSectionAtomizableBySymbols( 220b57cec5SDimitry Andric const MCSection &Section) const { 230b57cec5SDimitry Andric const MCSectionMachO &SMO = static_cast<const MCSectionMachO &>(Section); 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric // Sections holding 1 byte strings are atomized based on the data they 260b57cec5SDimitry Andric // contain. 270b57cec5SDimitry Andric // Sections holding 2 byte strings require symbols in order to be atomized. 280b57cec5SDimitry Andric // There is no dedicated section for 4 byte strings. 290b57cec5SDimitry Andric if (SMO.getType() == MachO::S_CSTRING_LITERALS) 300b57cec5SDimitry Andric return false; 310b57cec5SDimitry Andric 32*5ffd83dbSDimitry Andric if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__cfstring") 330b57cec5SDimitry Andric return false; 340b57cec5SDimitry Andric 35*5ffd83dbSDimitry Andric if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__objc_classrefs") 360b57cec5SDimitry Andric return false; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric switch (SMO.getType()) { 390b57cec5SDimitry Andric default: 400b57cec5SDimitry Andric return true; 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric // These sections are atomized at the element boundaries without using 430b57cec5SDimitry Andric // symbols. 440b57cec5SDimitry Andric case MachO::S_4BYTE_LITERALS: 450b57cec5SDimitry Andric case MachO::S_8BYTE_LITERALS: 460b57cec5SDimitry Andric case MachO::S_16BYTE_LITERALS: 470b57cec5SDimitry Andric case MachO::S_LITERAL_POINTERS: 480b57cec5SDimitry Andric case MachO::S_NON_LAZY_SYMBOL_POINTERS: 490b57cec5SDimitry Andric case MachO::S_LAZY_SYMBOL_POINTERS: 500b57cec5SDimitry Andric case MachO::S_THREAD_LOCAL_VARIABLE_POINTERS: 510b57cec5SDimitry Andric case MachO::S_MOD_INIT_FUNC_POINTERS: 520b57cec5SDimitry Andric case MachO::S_MOD_TERM_FUNC_POINTERS: 530b57cec5SDimitry Andric case MachO::S_INTERPOSING: 540b57cec5SDimitry Andric return false; 550b57cec5SDimitry Andric } 560b57cec5SDimitry Andric } 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric MCAsmInfoDarwin::MCAsmInfoDarwin() { 590b57cec5SDimitry Andric // Common settings for all Darwin targets. 600b57cec5SDimitry Andric // Syntax: 610b57cec5SDimitry Andric LinkerPrivateGlobalPrefix = "l"; 620b57cec5SDimitry Andric HasSingleParameterDotFile = false; 630b57cec5SDimitry Andric HasSubsectionsViaSymbols = true; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric AlignmentIsInBytes = false; 660b57cec5SDimitry Andric COMMDirectiveAlignmentIsInBytes = false; 670b57cec5SDimitry Andric LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment; 680b57cec5SDimitry Andric InlineAsmStart = " InlineAsm Start"; 690b57cec5SDimitry Andric InlineAsmEnd = " InlineAsm End"; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric // Directives: 720b57cec5SDimitry Andric HasWeakDefDirective = true; 730b57cec5SDimitry Andric HasWeakDefCanBeHiddenDirective = true; 740b57cec5SDimitry Andric WeakRefDirective = "\t.weak_reference "; 750b57cec5SDimitry Andric ZeroDirective = "\t.space\t"; // ".space N" emits N zeros. 760b57cec5SDimitry Andric HasMachoZeroFillDirective = true; // Uses .zerofill 770b57cec5SDimitry Andric HasMachoTBSSDirective = true; // Uses .tbss 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric // FIXME: Change this once MC is the system assembler. 800b57cec5SDimitry Andric HasAggressiveSymbolFolding = false; 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric HiddenVisibilityAttr = MCSA_PrivateExtern; 830b57cec5SDimitry Andric HiddenDeclarationVisibilityAttr = MCSA_Invalid; 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric // Doesn't support protected visibility. 860b57cec5SDimitry Andric ProtectedVisibilityAttr = MCSA_Invalid; 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric HasDotTypeDotSizeDirective = false; 890b57cec5SDimitry Andric HasNoDeadStrip = true; 900b57cec5SDimitry Andric HasAltEntry = true; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric DwarfUsesRelocationsAcrossSections = false; 930b57cec5SDimitry Andric SetDirectiveSuppressesReloc = true; 940b57cec5SDimitry Andric } 95