| //===- 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; | |
| } |