1 //===- MCAsmInfoDarwin.cpp - Darwin asm properties ------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines target asm properties related what form asm statements
10 // should take in general on Darwin-based targets
12 //===----------------------------------------------------------------------===//
14 #include "llvm/MC/MCAsmInfoDarwin.h"
15 #include "llvm/BinaryFormat/MachO.h"
16 #include "llvm/MC/MCDirectives.h"
17 #include "llvm/MC/MCSectionMachO.h"
21 bool MCAsmInfoDarwin::isSectionAtomizableBySymbols(
22 const MCSection
&Section
) const {
23 const MCSectionMachO
&SMO
= static_cast<const MCSectionMachO
&>(Section
);
25 // Sections holding 1 byte strings are atomized based on the data they
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
)
32 if (SMO
.getSegmentName() == "__DATA" && SMO
.getName() == "__cfstring")
35 if (SMO
.getSegmentName() == "__DATA" && SMO
.getName() == "__objc_classrefs")
38 switch (SMO
.getType()) {
42 // These sections are atomized at the element boundaries without using
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
:
58 MCAsmInfoDarwin::MCAsmInfoDarwin() {
59 // Common settings for all Darwin targets.
61 LinkerPrivateGlobalPrefix
= "l";
62 HasSingleParameterDotFile
= false;
63 HasSubsectionsViaSymbols
= true;
65 AlignmentIsInBytes
= false;
66 COMMDirectiveAlignmentIsInBytes
= false;
67 LCOMMDirectiveAlignmentType
= LCOMM::Log2Alignment
;
68 InlineAsmStart
= " InlineAsm Start";
69 InlineAsmEnd
= " InlineAsm End";
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
79 // FIXME: Change this once MC is the system assembler.
80 HasAggressiveSymbolFolding
= false;
82 HiddenVisibilityAttr
= MCSA_PrivateExtern
;
83 HiddenDeclarationVisibilityAttr
= MCSA_Invalid
;
85 // Doesn't support protected visibility.
86 ProtectedVisibilityAttr
= MCSA_Invalid
;
88 HasDotTypeDotSizeDirective
= false;
89 HasNoDeadStrip
= true;
92 DwarfUsesRelocationsAcrossSections
= false;
93 SetDirectiveSuppressesReloc
= true;