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
.getSectionName() == "__cfstring")
35 if (SMO
.getSegmentName() == "__DATA" &&
36 SMO
.getSectionName() == "__objc_classrefs")
39 switch (SMO
.getType()) {
43 // These sections are atomized at the element boundaries without using
45 case MachO::S_4BYTE_LITERALS
:
46 case MachO::S_8BYTE_LITERALS
:
47 case MachO::S_16BYTE_LITERALS
:
48 case MachO::S_LITERAL_POINTERS
:
49 case MachO::S_NON_LAZY_SYMBOL_POINTERS
:
50 case MachO::S_LAZY_SYMBOL_POINTERS
:
51 case MachO::S_THREAD_LOCAL_VARIABLE_POINTERS
:
52 case MachO::S_MOD_INIT_FUNC_POINTERS
:
53 case MachO::S_MOD_TERM_FUNC_POINTERS
:
54 case MachO::S_INTERPOSING
:
59 MCAsmInfoDarwin::MCAsmInfoDarwin() {
60 // Common settings for all Darwin targets.
62 LinkerPrivateGlobalPrefix
= "l";
63 HasSingleParameterDotFile
= false;
64 HasSubsectionsViaSymbols
= true;
66 AlignmentIsInBytes
= false;
67 COMMDirectiveAlignmentIsInBytes
= false;
68 LCOMMDirectiveAlignmentType
= LCOMM::Log2Alignment
;
69 InlineAsmStart
= " InlineAsm Start";
70 InlineAsmEnd
= " InlineAsm End";
73 HasWeakDefDirective
= true;
74 HasWeakDefCanBeHiddenDirective
= true;
75 WeakRefDirective
= "\t.weak_reference ";
76 ZeroDirective
= "\t.space\t"; // ".space N" emits N zeros.
77 HasMachoZeroFillDirective
= true; // Uses .zerofill
78 HasMachoTBSSDirective
= true; // Uses .tbss
80 // FIXME: Change this once MC is the system assembler.
81 HasAggressiveSymbolFolding
= false;
83 HiddenVisibilityAttr
= MCSA_PrivateExtern
;
84 HiddenDeclarationVisibilityAttr
= MCSA_Invalid
;
86 // Doesn't support protected visibility.
87 ProtectedVisibilityAttr
= MCSA_Invalid
;
89 HasDotTypeDotSizeDirective
= false;
90 HasNoDeadStrip
= true;
93 DwarfUsesRelocationsAcrossSections
= false;
95 UseIntegratedAssembler
= true;
96 SetDirectiveSuppressesReloc
= true;