1 | //===- MCAsmInfoDarwin.cpp - Darwin asm properties ------------------------===// |
---|---|
2 | // |
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 |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file defines target asm properties related what form asm statements |
10 | // should take in general on Darwin-based targets |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #include "llvm/MC/MCAsmInfoDarwin.h" |
15 | #include "llvm/BinaryFormat/MachO.h" |
16 | #include "llvm/MC/MCDirectives.h" |
17 | #include "llvm/MC/MCSectionMachO.h" |
18 | |
19 | using namespace llvm; |
20 | |
21 | bool MCAsmInfoDarwin::isSectionAtomizableBySymbols( |
22 | const MCSection &Section) { |
23 | const MCSectionMachO &SMO = static_cast<const MCSectionMachO &>(Section); |
24 | |
25 | // Sections holding 1 byte strings are atomized based on the data they |
26 | // contain. |
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) |
30 | return false; |
31 | |
32 | if (SMO.getSegmentName() == "__DATA"&& SMO.getName() == "__cfstring") |
33 | return false; |
34 | |
35 | if (SMO.getSegmentName() == "__DATA"&& SMO.getName() == "__objc_classrefs") |
36 | return false; |
37 | |
38 | switch (SMO.getType()) { |
39 | default: |
40 | return true; |
41 | |
42 | // These sections are atomized at the element boundaries without using |
43 | // symbols. |
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: |
54 | return false; |
55 | } |
56 | } |
57 | |
58 | MCAsmInfoDarwin::MCAsmInfoDarwin() { |
59 | // Common settings for all Darwin targets. |
60 | // Syntax: |
61 | LinkerPrivateGlobalPrefix = "l"; |
62 | HasSingleParameterDotFile = false; |
63 | HasSubsectionsViaSymbols = true; |
64 | |
65 | AlignmentIsInBytes = false; |
66 | COMMDirectiveAlignmentIsInBytes = false; |
67 | LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment; |
68 | InlineAsmStart = " InlineAsm Start"; |
69 | InlineAsmEnd = " InlineAsm End"; |
70 | |
71 | // Directives: |
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 |
78 | |
79 | // FIXME: Change this once MC is the system assembler. |
80 | HasAggressiveSymbolFolding = false; |
81 | |
82 | HiddenVisibilityAttr = MCSA_PrivateExtern; |
83 | HiddenDeclarationVisibilityAttr = MCSA_Invalid; |
84 | |
85 | // Doesn't support protected visibility. |
86 | ProtectedVisibilityAttr = MCSA_Invalid; |
87 | |
88 | HasDotTypeDotSizeDirective = false; |
89 | HasNoDeadStrip = true; |
90 | HasAltEntry = true; |
91 | |
92 | DwarfUsesRelocationsAcrossSections = false; |
93 | SetDirectiveSuppressesReloc = true; |
94 | } |
95 |