1 //===-- CSKYMCAsmInfo.cpp - CSKY 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 contains the declarations of the CSKYMCAsmInfo properties. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "CSKYMCAsmInfo.h" 14 #include "MCTargetDesc/CSKYMCAsmInfo.h" 15 #include "llvm/BinaryFormat/Dwarf.h" 16 #include "llvm/MC/MCExpr.h" 17 #include "llvm/MC/MCStreamer.h" 18 19 using namespace llvm; 20 21 const MCAsmInfo::AtSpecifier atSpecifiers[] = { 22 {CSKY::S_GOT, "GOT"}, {CSKY::S_GOTOFF, "GOTOFF"}, 23 {CSKY::S_PLT, "PLT"}, {CSKY::S_TLSGD, "TLSGD"}, 24 {CSKY::S_TLSLDM, "TLSLDM"}, {CSKY::S_TPOFF, "TPOFF"}, 25 }; 26 27 void CSKYMCAsmInfo::anchor() {} 28 29 CSKYMCAsmInfo::CSKYMCAsmInfo(const Triple &TargetTriple) { 30 AlignmentIsInBytes = false; 31 SupportsDebugInformation = true; 32 CommentString = "#"; 33 34 // Uses '.section' before '.bss' directive 35 UsesELFSectionDirectiveForBSS = true; 36 37 ExceptionsType = ExceptionHandling::DwarfCFI; 38 39 initializeAtSpecifiers(atSpecifiers); 40 } 41 42 static StringRef getVariantKindName(uint8_t Kind) { 43 using namespace CSKY; 44 switch (Kind) { 45 default: 46 llvm_unreachable("Invalid ELF symbol kind"); 47 case S_None: 48 case S_ADDR: 49 return ""; 50 case S_ADDR_HI16: 51 return "@HI16"; 52 case S_ADDR_LO16: 53 return "@LO16"; 54 case S_GOT_IMM18_BY4: 55 case S_GOT: 56 return "@GOT"; 57 case S_GOTPC: 58 return "@GOTPC"; 59 case S_GOTOFF: 60 return "@GOTOFF"; 61 case S_PLT_IMM18_BY4: 62 case S_PLT: 63 return "@PLT"; 64 case S_TLSLE: 65 return "@TPOFF"; 66 case S_TLSIE: 67 return "@GOTTPOFF"; 68 case S_TLSGD: 69 return "@TLSGD32"; 70 case S_TLSLDO: 71 return "@TLSLDO32"; 72 case S_TLSLDM: 73 return "@TLSLDM32"; 74 } 75 } 76 77 void CSKYMCAsmInfo::printSpecifierExpr(raw_ostream &OS, 78 const MCSpecifierExpr &Expr) const { 79 printExpr(OS, *Expr.getSubExpr()); 80 OS << getVariantKindName(Expr.getSpecifier()); 81 } 82