xref: /freebsd/contrib/llvm-project/llvm/lib/MC/MCAsmInfoDarwin.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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