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_AVR: 62 switch (Type) { 63 #include "llvm/BinaryFormat/ELFRelocs/AVR.def" 64 default: 65 break; 66 } 67 break; 68 case ELF::EM_HEXAGON: 69 switch (Type) { 70 #include "llvm/BinaryFormat/ELFRelocs/Hexagon.def" 71 default: 72 break; 73 } 74 break; 75 case ELF::EM_LANAI: 76 switch (Type) { 77 #include "llvm/BinaryFormat/ELFRelocs/Lanai.def" 78 default: 79 break; 80 } 81 break; 82 case ELF::EM_PPC: 83 switch (Type) { 84 #include "llvm/BinaryFormat/ELFRelocs/PowerPC.def" 85 default: 86 break; 87 } 88 break; 89 case ELF::EM_PPC64: 90 switch (Type) { 91 #include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def" 92 default: 93 break; 94 } 95 break; 96 case ELF::EM_RISCV: 97 switch (Type) { 98 #include "llvm/BinaryFormat/ELFRelocs/RISCV.def" 99 default: 100 break; 101 } 102 break; 103 case ELF::EM_S390: 104 switch (Type) { 105 #include "llvm/BinaryFormat/ELFRelocs/SystemZ.def" 106 default: 107 break; 108 } 109 break; 110 case ELF::EM_SPARC: 111 case ELF::EM_SPARC32PLUS: 112 case ELF::EM_SPARCV9: 113 switch (Type) { 114 #include "llvm/BinaryFormat/ELFRelocs/Sparc.def" 115 default: 116 break; 117 } 118 break; 119 case ELF::EM_WEBASSEMBLY: 120 switch (Type) { 121 #include "llvm/BinaryFormat/ELFRelocs/WebAssembly.def" 122 default: 123 break; 124 } 125 break; 126 case ELF::EM_AMDGPU: 127 switch (Type) { 128 #include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def" 129 default: 130 break; 131 } 132 case ELF::EM_BPF: 133 switch (Type) { 134 #include "llvm/BinaryFormat/ELFRelocs/BPF.def" 135 default: 136 break; 137 } 138 break; 139 default: 140 break; 141 } 142 return "Unknown"; 143 } 144 145 #undef ELF_RELOC 146 147 StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) { 148 switch (Machine) { 149 case ELF::EM_ARM: 150 switch (Type) { 151 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_EXIDX); 152 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_PREEMPTMAP); 153 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_ATTRIBUTES); 154 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_DEBUGOVERLAY); 155 STRINGIFY_ENUM_CASE(ELF, SHT_ARM_OVERLAYSECTION); 156 } 157 break; 158 case ELF::EM_HEXAGON: 159 switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_HEX_ORDERED); } 160 break; 161 case ELF::EM_X86_64: 162 switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_X86_64_UNWIND); } 163 break; 164 case ELF::EM_MIPS: 165 case ELF::EM_MIPS_RS3_LE: 166 switch (Type) { 167 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_REGINFO); 168 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_OPTIONS); 169 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS); 170 STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_DWARF); 171 } 172 break; 173 default: 174 break; 175 } 176 177 switch (Type) { 178 STRINGIFY_ENUM_CASE(ELF, SHT_NULL); 179 STRINGIFY_ENUM_CASE(ELF, SHT_PROGBITS); 180 STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB); 181 STRINGIFY_ENUM_CASE(ELF, SHT_STRTAB); 182 STRINGIFY_ENUM_CASE(ELF, SHT_RELA); 183 STRINGIFY_ENUM_CASE(ELF, SHT_HASH); 184 STRINGIFY_ENUM_CASE(ELF, SHT_DYNAMIC); 185 STRINGIFY_ENUM_CASE(ELF, SHT_NOTE); 186 STRINGIFY_ENUM_CASE(ELF, SHT_NOBITS); 187 STRINGIFY_ENUM_CASE(ELF, SHT_REL); 188 STRINGIFY_ENUM_CASE(ELF, SHT_SHLIB); 189 STRINGIFY_ENUM_CASE(ELF, SHT_DYNSYM); 190 STRINGIFY_ENUM_CASE(ELF, SHT_INIT_ARRAY); 191 STRINGIFY_ENUM_CASE(ELF, SHT_FINI_ARRAY); 192 STRINGIFY_ENUM_CASE(ELF, SHT_PREINIT_ARRAY); 193 STRINGIFY_ENUM_CASE(ELF, SHT_GROUP); 194 STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX); 195 STRINGIFY_ENUM_CASE(ELF, SHT_LLVM_ODRTAB); 196 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_ATTRIBUTES); 197 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_HASH); 198 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verdef); 199 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_verneed); 200 STRINGIFY_ENUM_CASE(ELF, SHT_GNU_versym); 201 default: 202 return "Unknown"; 203 } 204 } 205