xref: /freebsd/contrib/llvm-project/llvm/lib/MC/MCAsmInfoDarwin.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- MCAsmInfoDarwin.cpp - Darwin asm properties ------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file defines target asm properties related what form asm statements
100b57cec5SDimitry Andric // should take in general on Darwin-based targets
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "llvm/MC/MCAsmInfoDarwin.h"
150b57cec5SDimitry Andric #include "llvm/BinaryFormat/MachO.h"
160b57cec5SDimitry Andric #include "llvm/MC/MCDirectives.h"
170b57cec5SDimitry Andric #include "llvm/MC/MCSectionMachO.h"
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric using namespace llvm;
200b57cec5SDimitry Andric 
isSectionAtomizableBySymbols(const MCSection & Section)210b57cec5SDimitry Andric bool MCAsmInfoDarwin::isSectionAtomizableBySymbols(
22*0fca6ea1SDimitry Andric     const MCSection &Section) {
230b57cec5SDimitry Andric   const MCSectionMachO &SMO = static_cast<const MCSectionMachO &>(Section);
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric   // Sections holding 1 byte strings are atomized based on the data they
260b57cec5SDimitry Andric   // contain.
270b57cec5SDimitry Andric   // Sections holding 2 byte strings require symbols in order to be atomized.
280b57cec5SDimitry Andric   // There is no dedicated section for 4 byte strings.
290b57cec5SDimitry Andric   if (SMO.getType() == MachO::S_CSTRING_LITERALS)
300b57cec5SDimitry Andric     return false;
310b57cec5SDimitry Andric 
325ffd83dbSDimitry Andric   if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__cfstring")
330b57cec5SDimitry Andric     return false;
340b57cec5SDimitry Andric 
355ffd83dbSDimitry Andric   if (SMO.getSegmentName() == "__DATA" && SMO.getName() == "__objc_classrefs")
360b57cec5SDimitry Andric     return false;
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric   switch (SMO.getType()) {
390b57cec5SDimitry Andric   default:
400b57cec5SDimitry Andric     return true;
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   // These sections are atomized at the element boundaries without using
430b57cec5SDimitry Andric   // symbols.
440b57cec5SDimitry Andric   case MachO::S_4BYTE_LITERALS:
450b57cec5SDimitry Andric   case MachO::S_8BYTE_LITERALS:
460b57cec5SDimitry Andric   case MachO::S_16BYTE_LITERALS:
470b57cec5SDimitry Andric   case MachO::S_LITERAL_POINTERS:
480b57cec5SDimitry Andric   case MachO::S_NON_LAZY_SYMBOL_POINTERS:
490b57cec5SDimitry Andric   case MachO::S_LAZY_SYMBOL_POINTERS:
500b57cec5SDimitry Andric   case MachO::S_THREAD_LOCAL_VARIABLE_POINTERS:
510b57cec5SDimitry Andric   case MachO::S_MOD_INIT_FUNC_POINTERS:
520b57cec5SDimitry Andric   case MachO::S_MOD_TERM_FUNC_POINTERS:
530b57cec5SDimitry Andric   case MachO::S_INTERPOSING:
540b57cec5SDimitry Andric     return false;
550b57cec5SDimitry Andric   }
560b57cec5SDimitry Andric }
570b57cec5SDimitry Andric 
MCAsmInfoDarwin()580b57cec5SDimitry Andric MCAsmInfoDarwin::MCAsmInfoDarwin() {
590b57cec5SDimitry Andric   // Common settings for all Darwin targets.
600b57cec5SDimitry Andric   // Syntax:
610b57cec5SDimitry Andric   LinkerPrivateGlobalPrefix = "l";
620b57cec5SDimitry Andric   HasSingleParameterDotFile = false;
630b57cec5SDimitry Andric   HasSubsectionsViaSymbols = true;
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric   AlignmentIsInBytes = false;
660b57cec5SDimitry Andric   COMMDirectiveAlignmentIsInBytes = false;
670b57cec5SDimitry Andric   LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment;
680b57cec5SDimitry Andric   InlineAsmStart = " InlineAsm Start";
690b57cec5SDimitry Andric   InlineAsmEnd = " InlineAsm End";
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric   // Directives:
720b57cec5SDimitry Andric   HasWeakDefDirective = true;
730b57cec5SDimitry Andric   HasWeakDefCanBeHiddenDirective = true;
740b57cec5SDimitry Andric   WeakRefDirective = "\t.weak_reference ";
750b57cec5SDimitry Andric   ZeroDirective = "\t.space\t";  // ".space N" emits N zeros.
760b57cec5SDimitry Andric   HasMachoZeroFillDirective = true;  // Uses .zerofill
770b57cec5SDimitry Andric   HasMachoTBSSDirective = true; // Uses .tbss
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric   // FIXME: Change this once MC is the system assembler.
800b57cec5SDimitry Andric   HasAggressiveSymbolFolding = false;
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric   HiddenVisibilityAttr = MCSA_PrivateExtern;
830b57cec5SDimitry Andric   HiddenDeclarationVisibilityAttr = MCSA_Invalid;
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric   // Doesn't support protected visibility.
860b57cec5SDimitry Andric   ProtectedVisibilityAttr = MCSA_Invalid;
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric   HasDotTypeDotSizeDirective = false;
890b57cec5SDimitry Andric   HasNoDeadStrip = true;
900b57cec5SDimitry Andric   HasAltEntry = true;
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric   DwarfUsesRelocationsAcrossSections = false;
930b57cec5SDimitry Andric   SetDirectiveSuppressesReloc = true;
940b57cec5SDimitry Andric }
95