XCOFF.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //===-- llvm/BinaryFormat/XCOFF.cpp - The XCOFF file format -----*- C++/-*-===//
  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. #include "llvm/BinaryFormat/XCOFF.h"
  9. #include "llvm/ADT/SmallString.h"
  10. #include "llvm/ADT/StringRef.h"
  11. using namespace llvm;
  12. #define SMC_CASE(A) \
  13. case XCOFF::XMC_##A: \
  14. return #A;
  15. StringRef XCOFF::getMappingClassString(XCOFF::StorageMappingClass SMC) {
  16. switch (SMC) {
  17. SMC_CASE(PR)
  18. SMC_CASE(RO)
  19. SMC_CASE(DB)
  20. SMC_CASE(GL)
  21. SMC_CASE(XO)
  22. SMC_CASE(SV)
  23. SMC_CASE(SV64)
  24. SMC_CASE(SV3264)
  25. SMC_CASE(TI)
  26. SMC_CASE(TB)
  27. SMC_CASE(RW)
  28. SMC_CASE(TC0)
  29. SMC_CASE(TC)
  30. SMC_CASE(TD)
  31. SMC_CASE(DS)
  32. SMC_CASE(UA)
  33. SMC_CASE(BS)
  34. SMC_CASE(UC)
  35. SMC_CASE(TL)
  36. SMC_CASE(UL)
  37. SMC_CASE(TE)
  38. #undef SMC_CASE
  39. }
  40. // TODO: need to add a test case for "Unknown" and other SMC.
  41. return "Unknown";
  42. }
  43. #define RELOC_CASE(A) \
  44. case XCOFF::A: \
  45. return #A;
  46. StringRef XCOFF::getRelocationTypeString(XCOFF::RelocationType Type) {
  47. switch (Type) {
  48. RELOC_CASE(R_POS)
  49. RELOC_CASE(R_RL)
  50. RELOC_CASE(R_RLA)
  51. RELOC_CASE(R_NEG)
  52. RELOC_CASE(R_REL)
  53. RELOC_CASE(R_TOC)
  54. RELOC_CASE(R_TRL)
  55. RELOC_CASE(R_TRLA)
  56. RELOC_CASE(R_GL)
  57. RELOC_CASE(R_TCL)
  58. RELOC_CASE(R_REF)
  59. RELOC_CASE(R_BA)
  60. RELOC_CASE(R_BR)
  61. RELOC_CASE(R_RBA)
  62. RELOC_CASE(R_RBR)
  63. RELOC_CASE(R_TLS)
  64. RELOC_CASE(R_TLS_IE)
  65. RELOC_CASE(R_TLS_LD)
  66. RELOC_CASE(R_TLS_LE)
  67. RELOC_CASE(R_TLSM)
  68. RELOC_CASE(R_TLSML)
  69. RELOC_CASE(R_TOCU)
  70. RELOC_CASE(R_TOCL)
  71. }
  72. return "Unknown";
  73. }
  74. #define LANG_CASE(A) \
  75. case XCOFF::TracebackTable::A: \
  76. return #A;
  77. StringRef XCOFF::getNameForTracebackTableLanguageId(
  78. XCOFF::TracebackTable::LanguageID LangId) {
  79. switch (LangId) {
  80. LANG_CASE(C)
  81. LANG_CASE(Fortran)
  82. LANG_CASE(Pascal)
  83. LANG_CASE(Ada)
  84. LANG_CASE(PL1)
  85. LANG_CASE(Basic)
  86. LANG_CASE(Lisp)
  87. LANG_CASE(Cobol)
  88. LANG_CASE(Modula2)
  89. LANG_CASE(Rpg)
  90. LANG_CASE(PL8)
  91. LANG_CASE(Assembly)
  92. LANG_CASE(Java)
  93. LANG_CASE(ObjectiveC)
  94. LANG_CASE(CPlusPlus)
  95. }
  96. return "Unknown";
  97. }
  98. #undef LANG_CASE
  99. SmallString<32> XCOFF::parseParmsType(uint32_t Value, unsigned ParmsNum) {
  100. SmallString<32> ParmsType;
  101. for (unsigned I = 0; I < ParmsNum; ++I) {
  102. if (I != 0)
  103. ParmsType += ", ";
  104. if ((Value & TracebackTable::ParmTypeIsFloatingBit) == 0) {
  105. // Fixed parameter type.
  106. ParmsType += "i";
  107. Value <<= 1;
  108. } else {
  109. if ((Value & TracebackTable::ParmTypeFloatingIsDoubleBit) == 0)
  110. // Float parameter type.
  111. ParmsType += "f";
  112. else
  113. // Double parameter type.
  114. ParmsType += "d";
  115. Value <<= 2;
  116. }
  117. }
  118. assert(Value == 0u && "ParmsType encodes more than ParmsNum parameters.");
  119. return ParmsType;
  120. }
  121. SmallString<32> XCOFF::getExtendedTBTableFlagString(uint8_t Flag) {
  122. SmallString<32> Res;
  123. if (Flag & ExtendedTBTableFlag::TB_OS1)
  124. Res += "TB_OS1 ";
  125. if (Flag & ExtendedTBTableFlag::TB_RESERVED)
  126. Res += "TB_RESERVED ";
  127. if (Flag & ExtendedTBTableFlag::TB_SSP_CANARY)
  128. Res += "TB_SSP_CANARY ";
  129. if (Flag & ExtendedTBTableFlag::TB_OS2)
  130. Res += "TB_OS2 ";
  131. if (Flag & ExtendedTBTableFlag::TB_EH_INFO)
  132. Res += "TB_EH_INFO ";
  133. if (Flag & ExtendedTBTableFlag::TB_LONGTBTABLE2)
  134. Res += "TB_LONGTBTABLE2 ";
  135. // Two of the bits that haven't got used in the mask.
  136. if (Flag & 0x06)
  137. Res += "Unknown ";
  138. // Pop the last space.
  139. Res.pop_back();
  140. return Res;
  141. }
  142. #undef RELOC_CASE