forked from OSchip/llvm-project
569 lines
13 KiB
C++
569 lines
13 KiB
C++
|
//===- llvm/BinaryFormat/ELF.cpp - The ELF format ---------------*- C++ -*-===//
|
||
|
//
|
||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#include "llvm/BinaryFormat/ELF.h"
|
||
|
#include "llvm/ADT/DenseMap.h"
|
||
|
#include "llvm/ADT/StringSwitch.h"
|
||
|
#include "llvm/Support/Error.h"
|
||
|
|
||
|
using namespace llvm;
|
||
|
using namespace ELF;
|
||
|
|
||
|
/// Convert an architecture name into ELF's e_machine value.
|
||
|
uint16_t ELF::convertArchNameToEMachine(StringRef Arch) {
|
||
|
std::string LowerArch = Arch.lower();
|
||
|
return StringSwitch<uint16_t>(LowerArch)
|
||
|
.Case("none", EM_NONE)
|
||
|
.Case("m32", EM_M32)
|
||
|
.Case("sparc", EM_SPARC)
|
||
|
.Case("386", EM_386)
|
||
|
.Case("68k", EM_68K)
|
||
|
.Case("88k", EM_88K)
|
||
|
.Case("iamcu", EM_IAMCU)
|
||
|
.Case("860", EM_860)
|
||
|
.Case("mips", EM_MIPS)
|
||
|
.Case("s370", EM_S370)
|
||
|
.Case("mips_rs3_le", EM_MIPS_RS3_LE)
|
||
|
.Case("parisc", EM_PARISC)
|
||
|
.Case("vpp500", EM_VPP500)
|
||
|
.Case("sparc32plus", EM_SPARC32PLUS)
|
||
|
.Case("960", EM_960)
|
||
|
.Case("ppc", EM_PPC)
|
||
|
.Case("ppc64", EM_PPC64)
|
||
|
.Case("s390", EM_S390)
|
||
|
.Case("spu", EM_SPU)
|
||
|
.Case("v800", EM_V800)
|
||
|
.Case("fr20", EM_FR20)
|
||
|
.Case("rh32", EM_RH32)
|
||
|
.Case("rce", EM_RCE)
|
||
|
.Case("arm", EM_ARM)
|
||
|
.Case("alpha", EM_ALPHA)
|
||
|
.Case("sh", EM_SH)
|
||
|
.Case("sparcv9", EM_SPARCV9)
|
||
|
.Case("tricore", EM_TRICORE)
|
||
|
.Case("arc", EM_ARC)
|
||
|
.Case("h8_300", EM_H8_300)
|
||
|
.Case("h8_300h", EM_H8_300H)
|
||
|
.Case("h8s", EM_H8S)
|
||
|
.Case("h8_500", EM_H8_500)
|
||
|
.Case("ia_64", EM_IA_64)
|
||
|
.Case("mips_x", EM_MIPS_X)
|
||
|
.Case("coldfire", EM_COLDFIRE)
|
||
|
.Case("68hc12", EM_68HC12)
|
||
|
.Case("mma", EM_MMA)
|
||
|
.Case("pcp", EM_PCP)
|
||
|
.Case("ncpu", EM_NCPU)
|
||
|
.Case("ndr1", EM_NDR1)
|
||
|
.Case("starcore", EM_STARCORE)
|
||
|
.Case("me16", EM_ME16)
|
||
|
.Case("st100", EM_ST100)
|
||
|
.Case("tinyj", EM_TINYJ)
|
||
|
.Case("x86_64", EM_X86_64)
|
||
|
.Case("pdsp", EM_PDSP)
|
||
|
.Case("pdp10", EM_PDP10)
|
||
|
.Case("pdp11", EM_PDP11)
|
||
|
.Case("fx66", EM_FX66)
|
||
|
.Case("st9plus", EM_ST9PLUS)
|
||
|
.Case("st7", EM_ST7)
|
||
|
.Case("68hc16", EM_68HC16)
|
||
|
.Case("68hc11", EM_68HC11)
|
||
|
.Case("68hc08", EM_68HC08)
|
||
|
.Case("68hc05", EM_68HC05)
|
||
|
.Case("svx", EM_SVX)
|
||
|
.Case("st19", EM_ST19)
|
||
|
.Case("vax", EM_VAX)
|
||
|
.Case("cris", EM_CRIS)
|
||
|
.Case("javelin", EM_JAVELIN)
|
||
|
.Case("firepath", EM_FIREPATH)
|
||
|
.Case("zsp", EM_ZSP)
|
||
|
.Case("mmix", EM_MMIX)
|
||
|
.Case("huany", EM_HUANY)
|
||
|
.Case("prism", EM_PRISM)
|
||
|
.Case("avr", EM_AVR)
|
||
|
.Case("fr30", EM_FR30)
|
||
|
.Case("d10v", EM_D10V)
|
||
|
.Case("d30v", EM_D30V)
|
||
|
.Case("v850", EM_V850)
|
||
|
.Case("m32r", EM_M32R)
|
||
|
.Case("mn10300", EM_MN10300)
|
||
|
.Case("mn10200", EM_MN10200)
|
||
|
.Case("pj", EM_PJ)
|
||
|
.Case("openrisc", EM_OPENRISC)
|
||
|
.Case("arc_compact", EM_ARC_COMPACT)
|
||
|
.Case("xtensa", EM_XTENSA)
|
||
|
.Case("videocore", EM_VIDEOCORE)
|
||
|
.Case("tmm_gpp", EM_TMM_GPP)
|
||
|
.Case("ns32k", EM_NS32K)
|
||
|
.Case("tpc", EM_TPC)
|
||
|
.Case("snp1k", EM_SNP1K)
|
||
|
.Case("st200", EM_ST200)
|
||
|
.Case("ip2k", EM_IP2K)
|
||
|
.Case("max", EM_MAX)
|
||
|
.Case("cr", EM_CR)
|
||
|
.Case("f2mc16", EM_F2MC16)
|
||
|
.Case("msp430", EM_MSP430)
|
||
|
.Case("blackfin", EM_BLACKFIN)
|
||
|
.Case("se_c33", EM_SE_C33)
|
||
|
.Case("sep", EM_SEP)
|
||
|
.Case("arca", EM_ARCA)
|
||
|
.Case("unicore", EM_UNICORE)
|
||
|
.Case("excess", EM_EXCESS)
|
||
|
.Case("dxp", EM_DXP)
|
||
|
.Case("altera_nios2", EM_ALTERA_NIOS2)
|
||
|
.Case("crx", EM_CRX)
|
||
|
.Case("xgate", EM_XGATE)
|
||
|
.Case("c166", EM_C166)
|
||
|
.Case("m16c", EM_M16C)
|
||
|
.Case("dspic30f", EM_DSPIC30F)
|
||
|
.Case("ce", EM_CE)
|
||
|
.Case("m32c", EM_M32C)
|
||
|
.Case("tsk3000", EM_TSK3000)
|
||
|
.Case("rs08", EM_RS08)
|
||
|
.Case("sharc", EM_SHARC)
|
||
|
.Case("ecog2", EM_ECOG2)
|
||
|
.Case("score7", EM_SCORE7)
|
||
|
.Case("dsp24", EM_DSP24)
|
||
|
.Case("videocore3", EM_VIDEOCORE3)
|
||
|
.Case("latticemico32", EM_LATTICEMICO32)
|
||
|
.Case("se_c17", EM_SE_C17)
|
||
|
.Case("ti_c6000", EM_TI_C6000)
|
||
|
.Case("ti_c2000", EM_TI_C2000)
|
||
|
.Case("ti_c5500", EM_TI_C5500)
|
||
|
.Case("mmdsp_plus", EM_MMDSP_PLUS)
|
||
|
.Case("cypress_m8c", EM_CYPRESS_M8C)
|
||
|
.Case("r32c", EM_R32C)
|
||
|
.Case("trimedia", EM_TRIMEDIA)
|
||
|
.Case("hexagon", EM_HEXAGON)
|
||
|
.Case("8051", EM_8051)
|
||
|
.Case("stxp7x", EM_STXP7X)
|
||
|
.Case("nds32", EM_NDS32)
|
||
|
.Case("ecog1", EM_ECOG1)
|
||
|
.Case("ecog1x", EM_ECOG1X)
|
||
|
.Case("maxq30", EM_MAXQ30)
|
||
|
.Case("ximo16", EM_XIMO16)
|
||
|
.Case("manik", EM_MANIK)
|
||
|
.Case("craynv2", EM_CRAYNV2)
|
||
|
.Case("rx", EM_RX)
|
||
|
.Case("metag", EM_METAG)
|
||
|
.Case("mcst_elbrus", EM_MCST_ELBRUS)
|
||
|
.Case("ecog16", EM_ECOG16)
|
||
|
.Case("cr16", EM_CR16)
|
||
|
.Case("etpu", EM_ETPU)
|
||
|
.Case("sle9x", EM_SLE9X)
|
||
|
.Case("l10m", EM_L10M)
|
||
|
.Case("k10m", EM_K10M)
|
||
|
.Case("aarch64", EM_AARCH64)
|
||
|
.Case("avr32", EM_AVR32)
|
||
|
.Case("stm8", EM_STM8)
|
||
|
.Case("tile64", EM_TILE64)
|
||
|
.Case("tilepro", EM_TILEPRO)
|
||
|
.Case("cuda", EM_CUDA)
|
||
|
.Case("tilegx", EM_TILEGX)
|
||
|
.Case("cloudshield", EM_CLOUDSHIELD)
|
||
|
.Case("corea_1st", EM_COREA_1ST)
|
||
|
.Case("corea_2nd", EM_COREA_2ND)
|
||
|
.Case("arc_compact2", EM_ARC_COMPACT2)
|
||
|
.Case("open8", EM_OPEN8)
|
||
|
.Case("rl78", EM_RL78)
|
||
|
.Case("videocore5", EM_VIDEOCORE5)
|
||
|
.Case("78kor", EM_78KOR)
|
||
|
.Case("56800ex", EM_56800EX)
|
||
|
.Case("ba1", EM_BA1)
|
||
|
.Case("ba2", EM_BA2)
|
||
|
.Case("xcore", EM_XCORE)
|
||
|
.Case("mchp_pic", EM_MCHP_PIC)
|
||
|
.Case("intel205", EM_INTEL205)
|
||
|
.Case("intel206", EM_INTEL206)
|
||
|
.Case("intel207", EM_INTEL207)
|
||
|
.Case("intel208", EM_INTEL208)
|
||
|
.Case("intel209", EM_INTEL209)
|
||
|
.Case("km32", EM_KM32)
|
||
|
.Case("kmx32", EM_KMX32)
|
||
|
.Case("kmx16", EM_KMX16)
|
||
|
.Case("kmx8", EM_KMX8)
|
||
|
.Case("kvarc", EM_KVARC)
|
||
|
.Case("cdp", EM_CDP)
|
||
|
.Case("coge", EM_COGE)
|
||
|
.Case("cool", EM_COOL)
|
||
|
.Case("norc", EM_NORC)
|
||
|
.Case("csr_kalimba", EM_CSR_KALIMBA)
|
||
|
.Case("amdgpu", EM_AMDGPU)
|
||
|
.Case("riscv", EM_RISCV)
|
||
|
.Case("lanai", EM_LANAI)
|
||
|
.Case("bpf", EM_BPF)
|
||
|
.Case("ve", EM_VE)
|
||
|
.Case("csky", EM_CSKY)
|
||
|
.Default(EM_NONE);
|
||
|
}
|
||
|
|
||
|
/// Convert an ELF's e_machine value into an architecture name.
|
||
|
StringRef ELF::convertEMachineToArchName(uint16_t EMachine) {
|
||
|
switch (EMachine) {
|
||
|
case EM_NONE:
|
||
|
return "None";
|
||
|
case EM_M32:
|
||
|
return "m32";
|
||
|
case EM_SPARC:
|
||
|
return "sparc";
|
||
|
case EM_386:
|
||
|
return "386";
|
||
|
case EM_68K:
|
||
|
return "68k";
|
||
|
case EM_88K:
|
||
|
return "88k";
|
||
|
case EM_IAMCU:
|
||
|
return "iamcu";
|
||
|
case EM_860:
|
||
|
return "860";
|
||
|
case EM_MIPS:
|
||
|
return "mips";
|
||
|
case EM_S370:
|
||
|
return "s370";
|
||
|
case EM_MIPS_RS3_LE:
|
||
|
return "mips_rs3_le";
|
||
|
case EM_PARISC:
|
||
|
return "parisc";
|
||
|
case EM_VPP500:
|
||
|
return "vpp500";
|
||
|
case EM_SPARC32PLUS:
|
||
|
return "sparc32plus";
|
||
|
case EM_960:
|
||
|
return "960";
|
||
|
case EM_PPC:
|
||
|
return "ppc";
|
||
|
case EM_PPC64:
|
||
|
return "ppc64";
|
||
|
case EM_S390:
|
||
|
return "s390";
|
||
|
case EM_SPU:
|
||
|
return "spu";
|
||
|
case EM_V800:
|
||
|
return "v800";
|
||
|
case EM_FR20:
|
||
|
return "fr20";
|
||
|
case EM_RH32:
|
||
|
return "rh32";
|
||
|
case EM_RCE:
|
||
|
return "rce";
|
||
|
case EM_ARM:
|
||
|
return "arm";
|
||
|
case EM_ALPHA:
|
||
|
return "alpha";
|
||
|
case EM_SH:
|
||
|
return "sh";
|
||
|
case EM_SPARCV9:
|
||
|
return "sparcv9";
|
||
|
case EM_TRICORE:
|
||
|
return "tricore";
|
||
|
case EM_ARC:
|
||
|
return "arc";
|
||
|
case EM_H8_300:
|
||
|
return "h8_300";
|
||
|
case EM_H8_300H:
|
||
|
return "h8_300h";
|
||
|
case EM_H8S:
|
||
|
return "h8s";
|
||
|
case EM_H8_500:
|
||
|
return "h8_500";
|
||
|
case EM_IA_64:
|
||
|
return "ia_64";
|
||
|
case EM_MIPS_X:
|
||
|
return "mips_x";
|
||
|
case EM_COLDFIRE:
|
||
|
return "coldfire";
|
||
|
case EM_68HC12:
|
||
|
return "68hc12";
|
||
|
case EM_MMA:
|
||
|
return "mma";
|
||
|
case EM_PCP:
|
||
|
return "pcp";
|
||
|
case EM_NCPU:
|
||
|
return "ncpu";
|
||
|
case EM_NDR1:
|
||
|
return "ndr1";
|
||
|
case EM_STARCORE:
|
||
|
return "starcore";
|
||
|
case EM_ME16:
|
||
|
return "me16";
|
||
|
case EM_ST100:
|
||
|
return "st100";
|
||
|
case EM_TINYJ:
|
||
|
return "tinyj";
|
||
|
case EM_X86_64:
|
||
|
return "x86_64";
|
||
|
case EM_PDSP:
|
||
|
return "pdsp";
|
||
|
case EM_PDP10:
|
||
|
return "pdp10";
|
||
|
case EM_PDP11:
|
||
|
return "pdp11";
|
||
|
case EM_FX66:
|
||
|
return "fx66";
|
||
|
case EM_ST9PLUS:
|
||
|
return "st9plus";
|
||
|
case EM_ST7:
|
||
|
return "st7";
|
||
|
case EM_68HC16:
|
||
|
return "68hc16";
|
||
|
case EM_68HC11:
|
||
|
return "68hc11";
|
||
|
case EM_68HC08:
|
||
|
return "68hc08";
|
||
|
case EM_68HC05:
|
||
|
return "68hc05";
|
||
|
case EM_SVX:
|
||
|
return "svx";
|
||
|
case EM_ST19:
|
||
|
return "st19";
|
||
|
case EM_VAX:
|
||
|
return "vax";
|
||
|
case EM_CRIS:
|
||
|
return "cris";
|
||
|
case EM_JAVELIN:
|
||
|
return "javelin";
|
||
|
case EM_FIREPATH:
|
||
|
return "firepath";
|
||
|
case EM_ZSP:
|
||
|
return "zsp";
|
||
|
case EM_MMIX:
|
||
|
return "mmix";
|
||
|
case EM_HUANY:
|
||
|
return "huany";
|
||
|
case EM_PRISM:
|
||
|
return "prism";
|
||
|
case EM_AVR:
|
||
|
return "avr";
|
||
|
case EM_FR30:
|
||
|
return "fr30";
|
||
|
case EM_D10V:
|
||
|
return "d10v";
|
||
|
case EM_D30V:
|
||
|
return "d30v";
|
||
|
case EM_V850:
|
||
|
return "v850";
|
||
|
case EM_M32R:
|
||
|
return "m32r";
|
||
|
case EM_MN10300:
|
||
|
return "mn10300";
|
||
|
case EM_MN10200:
|
||
|
return "mn10200";
|
||
|
case EM_PJ:
|
||
|
return "pj";
|
||
|
case EM_OPENRISC:
|
||
|
return "openrisc";
|
||
|
case EM_ARC_COMPACT:
|
||
|
return "arc_compact";
|
||
|
case EM_XTENSA:
|
||
|
return "xtensa";
|
||
|
case EM_VIDEOCORE:
|
||
|
return "videocore";
|
||
|
case EM_TMM_GPP:
|
||
|
return "tmm_gpp";
|
||
|
case EM_NS32K:
|
||
|
return "ns32k";
|
||
|
case EM_TPC:
|
||
|
return "tpc";
|
||
|
case EM_SNP1K:
|
||
|
return "snp1k";
|
||
|
case EM_ST200:
|
||
|
return "st200";
|
||
|
case EM_IP2K:
|
||
|
return "ip2k";
|
||
|
case EM_MAX:
|
||
|
return "max";
|
||
|
case EM_CR:
|
||
|
return "cr";
|
||
|
case EM_F2MC16:
|
||
|
return "f2mc16";
|
||
|
case EM_MSP430:
|
||
|
return "msp430";
|
||
|
case EM_BLACKFIN:
|
||
|
return "blackfin";
|
||
|
case EM_SE_C33:
|
||
|
return "se_c33";
|
||
|
case EM_SEP:
|
||
|
return "sep";
|
||
|
case EM_ARCA:
|
||
|
return "arca";
|
||
|
case EM_UNICORE:
|
||
|
return "unicore";
|
||
|
case EM_EXCESS:
|
||
|
return "excess";
|
||
|
case EM_DXP:
|
||
|
return "dxp";
|
||
|
case EM_ALTERA_NIOS2:
|
||
|
return "altera_nios2";
|
||
|
case EM_CRX:
|
||
|
return "crx";
|
||
|
case EM_XGATE:
|
||
|
return "xgate";
|
||
|
case EM_C166:
|
||
|
return "c166";
|
||
|
case EM_M16C:
|
||
|
return "m16c";
|
||
|
case EM_DSPIC30F:
|
||
|
return "dspic30f";
|
||
|
case EM_CE:
|
||
|
return "ce";
|
||
|
case EM_M32C:
|
||
|
return "m32c";
|
||
|
case EM_TSK3000:
|
||
|
return "tsk3000";
|
||
|
case EM_RS08:
|
||
|
return "rs08";
|
||
|
case EM_SHARC:
|
||
|
return "sharc";
|
||
|
case EM_ECOG2:
|
||
|
return "ecog2";
|
||
|
case EM_SCORE7:
|
||
|
return "score7";
|
||
|
case EM_DSP24:
|
||
|
return "dsp24";
|
||
|
case EM_VIDEOCORE3:
|
||
|
return "videocore3";
|
||
|
case EM_LATTICEMICO32:
|
||
|
return "latticemico32";
|
||
|
case EM_SE_C17:
|
||
|
return "se_c17";
|
||
|
case EM_TI_C6000:
|
||
|
return "ti_c6000";
|
||
|
case EM_TI_C2000:
|
||
|
return "ti_c2000";
|
||
|
case EM_TI_C5500:
|
||
|
return "ti_c5500";
|
||
|
case EM_MMDSP_PLUS:
|
||
|
return "mmdsp_plus";
|
||
|
case EM_CYPRESS_M8C:
|
||
|
return "cypress_m8c";
|
||
|
case EM_R32C:
|
||
|
return "r32c";
|
||
|
case EM_TRIMEDIA:
|
||
|
return "trimedia";
|
||
|
case EM_HEXAGON:
|
||
|
return "hexagon";
|
||
|
case EM_8051:
|
||
|
return "8051";
|
||
|
case EM_STXP7X:
|
||
|
return "stxp7x";
|
||
|
case EM_NDS32:
|
||
|
return "nds32";
|
||
|
case EM_ECOG1:
|
||
|
return "ecog1";
|
||
|
case EM_MAXQ30:
|
||
|
return "maxq30";
|
||
|
case EM_XIMO16:
|
||
|
return "ximo16";
|
||
|
case EM_MANIK:
|
||
|
return "manik";
|
||
|
case EM_CRAYNV2:
|
||
|
return "craynv2";
|
||
|
case EM_RX:
|
||
|
return "rx";
|
||
|
case EM_METAG:
|
||
|
return "metag";
|
||
|
case EM_MCST_ELBRUS:
|
||
|
return "mcst_elbrus";
|
||
|
case EM_ECOG16:
|
||
|
return "ecog16";
|
||
|
case EM_CR16:
|
||
|
return "cr16";
|
||
|
case EM_ETPU:
|
||
|
return "etpu";
|
||
|
case EM_SLE9X:
|
||
|
return "sle9x";
|
||
|
case EM_L10M:
|
||
|
return "l10m";
|
||
|
case EM_K10M:
|
||
|
return "k10m";
|
||
|
case EM_AARCH64:
|
||
|
return "AArch64";
|
||
|
case EM_AVR32:
|
||
|
return "avr32";
|
||
|
case EM_STM8:
|
||
|
return "stm8";
|
||
|
case EM_TILE64:
|
||
|
return "tile64";
|
||
|
case EM_TILEPRO:
|
||
|
return "tilepro";
|
||
|
case EM_CUDA:
|
||
|
return "cuda";
|
||
|
case EM_TILEGX:
|
||
|
return "tilegx";
|
||
|
case EM_CLOUDSHIELD:
|
||
|
return "cloudshield";
|
||
|
case EM_COREA_1ST:
|
||
|
return "corea_1st";
|
||
|
case EM_COREA_2ND:
|
||
|
return "corea_2nd";
|
||
|
case EM_ARC_COMPACT2:
|
||
|
return "arc_compact2";
|
||
|
case EM_OPEN8:
|
||
|
return "open8";
|
||
|
case EM_RL78:
|
||
|
return "rl78";
|
||
|
case EM_VIDEOCORE5:
|
||
|
return "videocore5";
|
||
|
case EM_78KOR:
|
||
|
return "78kor";
|
||
|
case EM_56800EX:
|
||
|
return "56800ex";
|
||
|
case EM_BA1:
|
||
|
return "ba1";
|
||
|
case EM_BA2:
|
||
|
return "ba2";
|
||
|
case EM_XCORE:
|
||
|
return "xcore";
|
||
|
case EM_MCHP_PIC:
|
||
|
return "mchp_pic";
|
||
|
case EM_INTEL205:
|
||
|
return "intel205";
|
||
|
case EM_INTEL206:
|
||
|
return "intel206";
|
||
|
case EM_INTEL207:
|
||
|
return "intel207";
|
||
|
case EM_INTEL208:
|
||
|
return "intel208";
|
||
|
case EM_INTEL209:
|
||
|
return "intel209";
|
||
|
case EM_KM32:
|
||
|
return "km32";
|
||
|
case EM_KMX32:
|
||
|
return "kmx32";
|
||
|
case EM_KMX16:
|
||
|
return "kmx16";
|
||
|
case EM_KMX8:
|
||
|
return "kmx8";
|
||
|
case EM_KVARC:
|
||
|
return "kvarc";
|
||
|
case EM_CDP:
|
||
|
return "cdp";
|
||
|
case EM_COGE:
|
||
|
return "coge";
|
||
|
case EM_COOL:
|
||
|
return "cool";
|
||
|
case EM_NORC:
|
||
|
return "norc";
|
||
|
case EM_CSR_KALIMBA:
|
||
|
return "csr_kalimba";
|
||
|
case EM_AMDGPU:
|
||
|
return "amdgpu";
|
||
|
case EM_RISCV:
|
||
|
return "riscv";
|
||
|
case EM_LANAI:
|
||
|
return "lanai";
|
||
|
case EM_BPF:
|
||
|
return "bpf";
|
||
|
case EM_VE:
|
||
|
return "ve";
|
||
|
case EM_CSKY:
|
||
|
return "csky";
|
||
|
default:
|
||
|
return "None";
|
||
|
}
|
||
|
}
|