1 //===- ELF.cpp - ELF object file implementation ---------------------------===// 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 #include "llvm/Object/ELF.h" 11 #include "llvm/BinaryFormat/ELF.h" 12 13 using namespace llvm; 14 using namespace object; 15 16 #define STRINGIFY_ENUM_CASE(ns, name) \ 17 case ns::name: \ 18 return #name; 19 20 #define ELF_RELOC(name, value) STRINGIFY_ENUM_CASE(ELF, name) 21 22 StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine, 23 uint32_t Type) { 24 switch (Machine) { 25 case ELF::EM_X86_64: 26 switch (Type) { 27 #include "llvm/BinaryFormat/ELFRelocs/x86_64.def" 28 default: 29 break; 30 } 31 break; 32 case ELF::EM_386: 33 case ELF::EM_IAMCU: 34 switch (Type) { 35 #include "llvm/BinaryFormat/ELFRelocs/i386.def" 36 default: 37 break; 38 } 39 break; 40 case ELF::EM_MIPS: 41 switch (Type) { 42 #include "llvm/BinaryFormat/ELFRelocs/Mips.def" 43 default: 44 break; 45 } 46 break; 47 case ELF::EM_AARCH64: 48 switch (Type) { 49 #include "llvm/BinaryFormat/ELFRelocs/AArch64.def" 50 default: 51 break; 52 } 53 break; 54 case ELF::EM_ARM: 55 switch (Type) { 56 #include "llvm/BinaryFormat/ELFRelocs/ARM.def" 57 default: 58 break; 59 } 60 break; 61 case ELF::EM_ARC_COMPACT: 62 case ELF::EM_ARC_COMPACT2: 63 switch (Type) { 64 #include "llvm/BinaryFormat/ELFRelocs/ARC.def" 65 default: 66 break; 67 } 68 break; 69 case ELF::EM_AVR: 70 switch (Type) { 71 #include "llvm/BinaryFormat/ELFRelocs/AVR.def" 72 default: 73 break; 74 } 75 break; 76 case ELF::EM_HEXAGON: 77 switch (Type) { 78 #include "llvm/BinaryFormat/ELFRelocs/Hexagon.def" 79 default: 80 break; 81 } 82 break; 83 case ELF::EM_LANAI: 84 switch (Type) { 85 #include "llvm/BinaryFormat/ELFRelocs/Lanai.def" 86 default: 87 break; 88 } 89 break; 90 case ELF::EM_PPC: 91 switch (Type) { 92 #include "llvm/BinaryFormat/ELFRelocs/PowerPC.def" 93 default: 94 break; 95 } 96 break; 97 case ELF::EM_PPC64: 98 switch (Type) { 99 #include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def" 100 default: 101 break; 102 } 103 break; 104 case ELF::EM_RISCV: 105 switch (Type) { 106 #include "llvm/BinaryFormat/ELFRelocs/RISCV.def" 107 default: 108 break; 109 } 110 break; 111 case ELF::EM_S390: 112 switch (Type) { 113 #include "llvm/BinaryFormat/ELFRelocs/SystemZ.def" 114 default: 115 break; 116 } 117 break; 118 case ELF::EM_SPARC: 119 case ELF::EM_SPARC32PLUS: 120 case ELF::EM_SPARCV9: 121 switch (Type) { 122 #include "llvm/BinaryFormat/ELFRelocs/Sparc.def" 123 default: 124 break; 125 } 126 break; 127 case ELF::EM_WEBASSEMBLY: 128 switch (Type) { 129 #include "llvm/BinaryFormat/ELFRelocs/WebAssembly.def" 130 default: 131 break; 132 } 133 break; 134 case ELF::EM_AMDGPU: 135 switch (Type) { 136 #include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def" 137 default: 138 break; 139 } 140 case ELF::EM_BPF: 141 switch (Type) { 142 #include "llvm/BinaryFormat/ELFRelocs/BPF.def" 143 default: 144 break; 145 } 146 break; 147 default: 148 break; 149 } 150 return "Unknown"; 151 } 152 153 #undef ELF_RELOC 154 155 StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) { 156 switch (Machine) { 157 case ELF::EM_ARM: 158 switch (Type) { 159 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_EXIDX); 160 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP); 161 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES); 162 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY); 163 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION); 164 } 165 break; 166 case ELF::EM_HEXAGON: 167 switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_HEX_ORDERED); } 168 break; 169 case ELF::EM_X86_64: 170 switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_X86_64_UNWIND); } 171 break; 172 case ELF::EM_MIPS: 173 case ELF::EM_MIPS_RS3_LE: 174 switch (Type) { 175 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_REGINFO); 176 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_OPTIONS); 177 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS); 178 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_DWARF); 179 } 180 break; 181 default: 182 break; 183 } 184 185 switch (Type) { 186 STRINGIFY_ENUM_CASE(ELF, SHT_NULL); 187 STRINGIFY_ENUM_CASE(ELF, SHT_PROGBITS); 188 STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB); 189 STRINGIFY_ENUM_CASE(ELF, SHT_STRTAB); 190 STRINGIFY_ENUM_CASE(ELF, SHT_RELA); 191 STRINGIFY_ENUM_CASE(ELF, SHT_HASH); 192 STRINGIFY_ENUM_CASE(ELF, SHT_DYNAMIC); 193 STRINGIFY_ENUM_CASE(ELF, SHT_NOTE); 194 STRINGIFY_ENUM_CASE(ELF, SHT_NOBITS); 195 STRINGIFY_ENUM_CASE(ELF, SHT_REL); 196 STRINGIFY_ENUM_CASE(ELF, SHT_SHLIB); 197 STRINGIFY_ENUM_CASE(ELF, SHT_DYNSYM); 198 STRINGIFY_ENUM_CASE(ELF, SHT_INIT_ARRAY); 199 STRINGIFY_ENUM_CASE(ELF, SHT_FINI_ARRAY); 200 STRINGIFY_ENUM_CASE(ELF, SHT_PREINIT_ARRAY); 201 STRINGIFY_ENUM_CASE(ELF, SHT_GROUP); 202 STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX); 203 STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ODRTAB); 204 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES); 205 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH); 206 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef); 207 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verneed); 208 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_versym); 209 default: 210 return "Unknown"; 211 } 212 } 213