1 //===-- MCAsmInfoDarwin.cpp - Darwin asm properties -------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines target asm properties related what form asm statements 11 // should take in general on Darwin-based targets 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/MC/MCAsmInfoDarwin.h" 16 #include "llvm/MC/MCContext.h" 17 #include "llvm/MC/MCExpr.h" 18 #include "llvm/MC/MCSectionMachO.h" 19 using namespace llvm; 20 21 bool MCAsmInfoDarwin::isSectionAtomizableBySymbols( 22 const MCSection &Section) const { 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.getSectionName() == "__cfstring") 33 return false; 34 35 if (SMO.getSegmentName() == "__DATA" && 36 SMO.getSectionName() == "__objc_classrefs") 37 return false; 38 39 switch (SMO.getType()) { 40 default: 41 return true; 42 43 // These sections are atomized at the element boundaries without using 44 // symbols. 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: 55 return false; 56 } 57 } 58 59 MCAsmInfoDarwin::MCAsmInfoDarwin() { 60 // Common settings for all Darwin targets. 61 // Syntax: 62 LinkerPrivateGlobalPrefix = "l"; 63 HasSingleParameterDotFile = false; 64 HasSubsectionsViaSymbols = true; 65 66 AlignmentIsInBytes = false; 67 COMMDirectiveAlignmentIsInBytes = false; 68 LCOMMDirectiveAlignmentType = LCOMM::Log2Alignment; 69 InlineAsmStart = " InlineAsm Start"; 70 InlineAsmEnd = " InlineAsm End"; 71 72 // Directives: 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 79 HasStaticCtorDtorReferenceInStaticMode = true; 80 81 // FIXME: Change this once MC is the system assembler. 82 HasAggressiveSymbolFolding = false; 83 84 HiddenVisibilityAttr = MCSA_PrivateExtern; 85 HiddenDeclarationVisibilityAttr = MCSA_Invalid; 86 87 // Doesn't support protected visibility. 88 ProtectedVisibilityAttr = MCSA_Invalid; 89 90 HasDotTypeDotSizeDirective = false; 91 HasNoDeadStrip = true; 92 HasAltEntry = true; 93 94 DwarfUsesRelocationsAcrossSections = false; 95 96 UseIntegratedAssembler = true; 97 SetDirectiveSuppressesReloc = true; 98 } 99