PPCELFObjectWriter.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. //===-- PPCELFObjectWriter.cpp - PPC ELF Writer ---------------------------===//
  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 "MCTargetDesc/PPCFixupKinds.h"
  9. #include "MCTargetDesc/PPCMCExpr.h"
  10. #include "MCTargetDesc/PPCMCTargetDesc.h"
  11. #include "llvm/ADT/STLExtras.h"
  12. #include "llvm/MC/MCELFObjectWriter.h"
  13. #include "llvm/MC/MCExpr.h"
  14. #include "llvm/MC/MCObjectWriter.h"
  15. #include "llvm/MC/MCSymbolELF.h"
  16. #include "llvm/MC/MCValue.h"
  17. #include "llvm/Support/ErrorHandling.h"
  18. using namespace llvm;
  19. namespace {
  20. class PPCELFObjectWriter : public MCELFObjectTargetWriter {
  21. public:
  22. PPCELFObjectWriter(bool Is64Bit, uint8_t OSABI);
  23. protected:
  24. unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
  25. const MCFixup &Fixup, bool IsPCRel) const override;
  26. bool needsRelocateWithSymbol(const MCSymbol &Sym,
  27. unsigned Type) const override;
  28. };
  29. }
  30. PPCELFObjectWriter::PPCELFObjectWriter(bool Is64Bit, uint8_t OSABI)
  31. : MCELFObjectTargetWriter(Is64Bit, OSABI,
  32. Is64Bit ? ELF::EM_PPC64 : ELF::EM_PPC,
  33. /*HasRelocationAddend*/ true) {}
  34. static MCSymbolRefExpr::VariantKind getAccessVariant(const MCValue &Target,
  35. const MCFixup &Fixup) {
  36. const MCExpr *Expr = Fixup.getValue();
  37. if (Expr->getKind() != MCExpr::Target)
  38. return Target.getAccessVariant();
  39. switch (cast<PPCMCExpr>(Expr)->getKind()) {
  40. case PPCMCExpr::VK_PPC_None:
  41. return MCSymbolRefExpr::VK_None;
  42. case PPCMCExpr::VK_PPC_LO:
  43. return MCSymbolRefExpr::VK_PPC_LO;
  44. case PPCMCExpr::VK_PPC_HI:
  45. return MCSymbolRefExpr::VK_PPC_HI;
  46. case PPCMCExpr::VK_PPC_HA:
  47. return MCSymbolRefExpr::VK_PPC_HA;
  48. case PPCMCExpr::VK_PPC_HIGH:
  49. return MCSymbolRefExpr::VK_PPC_HIGH;
  50. case PPCMCExpr::VK_PPC_HIGHA:
  51. return MCSymbolRefExpr::VK_PPC_HIGHA;
  52. case PPCMCExpr::VK_PPC_HIGHERA:
  53. return MCSymbolRefExpr::VK_PPC_HIGHERA;
  54. case PPCMCExpr::VK_PPC_HIGHER:
  55. return MCSymbolRefExpr::VK_PPC_HIGHER;
  56. case PPCMCExpr::VK_PPC_HIGHEST:
  57. return MCSymbolRefExpr::VK_PPC_HIGHEST;
  58. case PPCMCExpr::VK_PPC_HIGHESTA:
  59. return MCSymbolRefExpr::VK_PPC_HIGHESTA;
  60. }
  61. llvm_unreachable("unknown PPCMCExpr kind");
  62. }
  63. unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
  64. const MCFixup &Fixup,
  65. bool IsPCRel) const {
  66. MCFixupKind Kind = Fixup.getKind();
  67. if (Kind >= FirstLiteralRelocationKind)
  68. return Kind - FirstLiteralRelocationKind;
  69. MCSymbolRefExpr::VariantKind Modifier = getAccessVariant(Target, Fixup);
  70. // determine the type of the relocation
  71. unsigned Type;
  72. if (IsPCRel) {
  73. switch (Fixup.getTargetKind()) {
  74. default:
  75. llvm_unreachable("Unimplemented");
  76. case PPC::fixup_ppc_br24:
  77. case PPC::fixup_ppc_br24abs:
  78. case PPC::fixup_ppc_br24_notoc:
  79. switch (Modifier) {
  80. default: llvm_unreachable("Unsupported Modifier");
  81. case MCSymbolRefExpr::VK_None:
  82. Type = ELF::R_PPC_REL24;
  83. break;
  84. case MCSymbolRefExpr::VK_PLT:
  85. Type = ELF::R_PPC_PLTREL24;
  86. break;
  87. case MCSymbolRefExpr::VK_PPC_LOCAL:
  88. Type = ELF::R_PPC_LOCAL24PC;
  89. break;
  90. case MCSymbolRefExpr::VK_PPC_NOTOC:
  91. Type = ELF::R_PPC64_REL24_NOTOC;
  92. break;
  93. }
  94. break;
  95. case PPC::fixup_ppc_brcond14:
  96. case PPC::fixup_ppc_brcond14abs:
  97. Type = ELF::R_PPC_REL14;
  98. break;
  99. case PPC::fixup_ppc_half16:
  100. switch (Modifier) {
  101. default: llvm_unreachable("Unsupported Modifier");
  102. case MCSymbolRefExpr::VK_None:
  103. Type = ELF::R_PPC_REL16;
  104. break;
  105. case MCSymbolRefExpr::VK_PPC_LO:
  106. Type = ELF::R_PPC_REL16_LO;
  107. break;
  108. case MCSymbolRefExpr::VK_PPC_HI:
  109. Type = ELF::R_PPC_REL16_HI;
  110. break;
  111. case MCSymbolRefExpr::VK_PPC_HA:
  112. Type = ELF::R_PPC_REL16_HA;
  113. break;
  114. }
  115. break;
  116. case PPC::fixup_ppc_half16ds:
  117. Target.print(errs());
  118. errs() << '\n';
  119. report_fatal_error("Invalid PC-relative half16ds relocation");
  120. case PPC::fixup_ppc_pcrel34:
  121. switch (Modifier) {
  122. default:
  123. llvm_unreachable("Unsupported Modifier for fixup_ppc_pcrel34");
  124. case MCSymbolRefExpr::VK_PCREL:
  125. Type = ELF::R_PPC64_PCREL34;
  126. break;
  127. case MCSymbolRefExpr::VK_PPC_GOT_PCREL:
  128. Type = ELF::R_PPC64_GOT_PCREL34;
  129. break;
  130. case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL:
  131. Type = ELF::R_PPC64_GOT_TLSGD_PCREL34;
  132. break;
  133. case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_PCREL:
  134. Type = ELF::R_PPC64_GOT_TLSLD_PCREL34;
  135. break;
  136. case MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL:
  137. Type = ELF::R_PPC64_GOT_TPREL_PCREL34;
  138. break;
  139. }
  140. break;
  141. case FK_Data_4:
  142. case FK_PCRel_4:
  143. Type = ELF::R_PPC_REL32;
  144. break;
  145. case FK_Data_8:
  146. case FK_PCRel_8:
  147. Type = ELF::R_PPC64_REL64;
  148. break;
  149. }
  150. } else {
  151. switch (Fixup.getTargetKind()) {
  152. default: llvm_unreachable("invalid fixup kind!");
  153. case PPC::fixup_ppc_br24abs:
  154. Type = ELF::R_PPC_ADDR24;
  155. break;
  156. case PPC::fixup_ppc_brcond14abs:
  157. Type = ELF::R_PPC_ADDR14; // XXX: or BRNTAKEN?_
  158. break;
  159. case PPC::fixup_ppc_half16:
  160. switch (Modifier) {
  161. default: llvm_unreachable("Unsupported Modifier");
  162. case MCSymbolRefExpr::VK_None:
  163. Type = ELF::R_PPC_ADDR16;
  164. break;
  165. case MCSymbolRefExpr::VK_PPC_LO:
  166. Type = ELF::R_PPC_ADDR16_LO;
  167. break;
  168. case MCSymbolRefExpr::VK_PPC_HI:
  169. Type = ELF::R_PPC_ADDR16_HI;
  170. break;
  171. case MCSymbolRefExpr::VK_PPC_HA:
  172. Type = ELF::R_PPC_ADDR16_HA;
  173. break;
  174. case MCSymbolRefExpr::VK_PPC_HIGH:
  175. Type = ELF::R_PPC64_ADDR16_HIGH;
  176. break;
  177. case MCSymbolRefExpr::VK_PPC_HIGHA:
  178. Type = ELF::R_PPC64_ADDR16_HIGHA;
  179. break;
  180. case MCSymbolRefExpr::VK_PPC_HIGHER:
  181. Type = ELF::R_PPC64_ADDR16_HIGHER;
  182. break;
  183. case MCSymbolRefExpr::VK_PPC_HIGHERA:
  184. Type = ELF::R_PPC64_ADDR16_HIGHERA;
  185. break;
  186. case MCSymbolRefExpr::VK_PPC_HIGHEST:
  187. Type = ELF::R_PPC64_ADDR16_HIGHEST;
  188. break;
  189. case MCSymbolRefExpr::VK_PPC_HIGHESTA:
  190. Type = ELF::R_PPC64_ADDR16_HIGHESTA;
  191. break;
  192. case MCSymbolRefExpr::VK_GOT:
  193. Type = ELF::R_PPC_GOT16;
  194. break;
  195. case MCSymbolRefExpr::VK_PPC_GOT_LO:
  196. Type = ELF::R_PPC_GOT16_LO;
  197. break;
  198. case MCSymbolRefExpr::VK_PPC_GOT_HI:
  199. Type = ELF::R_PPC_GOT16_HI;
  200. break;
  201. case MCSymbolRefExpr::VK_PPC_GOT_HA:
  202. Type = ELF::R_PPC_GOT16_HA;
  203. break;
  204. case MCSymbolRefExpr::VK_PPC_TOC:
  205. Type = ELF::R_PPC64_TOC16;
  206. break;
  207. case MCSymbolRefExpr::VK_PPC_TOC_LO:
  208. Type = ELF::R_PPC64_TOC16_LO;
  209. break;
  210. case MCSymbolRefExpr::VK_PPC_TOC_HI:
  211. Type = ELF::R_PPC64_TOC16_HI;
  212. break;
  213. case MCSymbolRefExpr::VK_PPC_TOC_HA:
  214. Type = ELF::R_PPC64_TOC16_HA;
  215. break;
  216. case MCSymbolRefExpr::VK_TPREL:
  217. Type = ELF::R_PPC_TPREL16;
  218. break;
  219. case MCSymbolRefExpr::VK_PPC_TPREL_LO:
  220. Type = ELF::R_PPC_TPREL16_LO;
  221. break;
  222. case MCSymbolRefExpr::VK_PPC_TPREL_HI:
  223. Type = ELF::R_PPC_TPREL16_HI;
  224. break;
  225. case MCSymbolRefExpr::VK_PPC_TPREL_HA:
  226. Type = ELF::R_PPC_TPREL16_HA;
  227. break;
  228. case MCSymbolRefExpr::VK_PPC_TPREL_HIGH:
  229. Type = ELF::R_PPC64_TPREL16_HIGH;
  230. break;
  231. case MCSymbolRefExpr::VK_PPC_TPREL_HIGHA:
  232. Type = ELF::R_PPC64_TPREL16_HIGHA;
  233. break;
  234. case MCSymbolRefExpr::VK_PPC_TPREL_HIGHER:
  235. Type = ELF::R_PPC64_TPREL16_HIGHER;
  236. break;
  237. case MCSymbolRefExpr::VK_PPC_TPREL_HIGHERA:
  238. Type = ELF::R_PPC64_TPREL16_HIGHERA;
  239. break;
  240. case MCSymbolRefExpr::VK_PPC_TPREL_HIGHEST:
  241. Type = ELF::R_PPC64_TPREL16_HIGHEST;
  242. break;
  243. case MCSymbolRefExpr::VK_PPC_TPREL_HIGHESTA:
  244. Type = ELF::R_PPC64_TPREL16_HIGHESTA;
  245. break;
  246. case MCSymbolRefExpr::VK_DTPREL:
  247. Type = ELF::R_PPC64_DTPREL16;
  248. break;
  249. case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
  250. Type = ELF::R_PPC64_DTPREL16_LO;
  251. break;
  252. case MCSymbolRefExpr::VK_PPC_DTPREL_HI:
  253. Type = ELF::R_PPC64_DTPREL16_HI;
  254. break;
  255. case MCSymbolRefExpr::VK_PPC_DTPREL_HA:
  256. Type = ELF::R_PPC64_DTPREL16_HA;
  257. break;
  258. case MCSymbolRefExpr::VK_PPC_DTPREL_HIGH:
  259. Type = ELF::R_PPC64_DTPREL16_HIGH;
  260. break;
  261. case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHA:
  262. Type = ELF::R_PPC64_DTPREL16_HIGHA;
  263. break;
  264. case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHER:
  265. Type = ELF::R_PPC64_DTPREL16_HIGHER;
  266. break;
  267. case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHERA:
  268. Type = ELF::R_PPC64_DTPREL16_HIGHERA;
  269. break;
  270. case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHEST:
  271. Type = ELF::R_PPC64_DTPREL16_HIGHEST;
  272. break;
  273. case MCSymbolRefExpr::VK_PPC_DTPREL_HIGHESTA:
  274. Type = ELF::R_PPC64_DTPREL16_HIGHESTA;
  275. break;
  276. case MCSymbolRefExpr::VK_PPC_GOT_TLSGD:
  277. if (is64Bit())
  278. Type = ELF::R_PPC64_GOT_TLSGD16;
  279. else
  280. Type = ELF::R_PPC_GOT_TLSGD16;
  281. break;
  282. case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO:
  283. Type = ELF::R_PPC64_GOT_TLSGD16_LO;
  284. break;
  285. case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HI:
  286. Type = ELF::R_PPC64_GOT_TLSGD16_HI;
  287. break;
  288. case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_HA:
  289. Type = ELF::R_PPC64_GOT_TLSGD16_HA;
  290. break;
  291. case MCSymbolRefExpr::VK_PPC_GOT_TLSLD:
  292. if (is64Bit())
  293. Type = ELF::R_PPC64_GOT_TLSLD16;
  294. else
  295. Type = ELF::R_PPC_GOT_TLSLD16;
  296. break;
  297. case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO:
  298. Type = ELF::R_PPC64_GOT_TLSLD16_LO;
  299. break;
  300. case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HI:
  301. Type = ELF::R_PPC64_GOT_TLSLD16_HI;
  302. break;
  303. case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_HA:
  304. Type = ELF::R_PPC64_GOT_TLSLD16_HA;
  305. break;
  306. case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
  307. /* We don't have R_PPC64_GOT_TPREL16, but since GOT offsets
  308. are always 4-aligned, we can use R_PPC64_GOT_TPREL16_DS. */
  309. Type = ELF::R_PPC64_GOT_TPREL16_DS;
  310. break;
  311. case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
  312. /* We don't have R_PPC64_GOT_TPREL16_LO, but since GOT offsets
  313. are always 4-aligned, we can use R_PPC64_GOT_TPREL16_LO_DS. */
  314. Type = ELF::R_PPC64_GOT_TPREL16_LO_DS;
  315. break;
  316. case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HI:
  317. Type = ELF::R_PPC64_GOT_TPREL16_HI;
  318. break;
  319. case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
  320. /* We don't have R_PPC64_GOT_DTPREL16, but since GOT offsets
  321. are always 4-aligned, we can use R_PPC64_GOT_DTPREL16_DS. */
  322. Type = ELF::R_PPC64_GOT_DTPREL16_DS;
  323. break;
  324. case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
  325. /* We don't have R_PPC64_GOT_DTPREL16_LO, but since GOT offsets
  326. are always 4-aligned, we can use R_PPC64_GOT_DTPREL16_LO_DS. */
  327. Type = ELF::R_PPC64_GOT_DTPREL16_LO_DS;
  328. break;
  329. case MCSymbolRefExpr::VK_PPC_GOT_TPREL_HA:
  330. Type = ELF::R_PPC64_GOT_TPREL16_HA;
  331. break;
  332. case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HI:
  333. Type = ELF::R_PPC64_GOT_DTPREL16_HI;
  334. break;
  335. case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_HA:
  336. Type = ELF::R_PPC64_GOT_DTPREL16_HA;
  337. break;
  338. }
  339. break;
  340. case PPC::fixup_ppc_half16ds:
  341. switch (Modifier) {
  342. default: llvm_unreachable("Unsupported Modifier");
  343. case MCSymbolRefExpr::VK_None:
  344. Type = ELF::R_PPC64_ADDR16_DS;
  345. break;
  346. case MCSymbolRefExpr::VK_PPC_LO:
  347. Type = ELF::R_PPC64_ADDR16_LO_DS;
  348. break;
  349. case MCSymbolRefExpr::VK_GOT:
  350. Type = ELF::R_PPC64_GOT16_DS;
  351. break;
  352. case MCSymbolRefExpr::VK_PPC_GOT_LO:
  353. Type = ELF::R_PPC64_GOT16_LO_DS;
  354. break;
  355. case MCSymbolRefExpr::VK_PPC_TOC:
  356. Type = ELF::R_PPC64_TOC16_DS;
  357. break;
  358. case MCSymbolRefExpr::VK_PPC_TOC_LO:
  359. Type = ELF::R_PPC64_TOC16_LO_DS;
  360. break;
  361. case MCSymbolRefExpr::VK_TPREL:
  362. Type = ELF::R_PPC64_TPREL16_DS;
  363. break;
  364. case MCSymbolRefExpr::VK_PPC_TPREL_LO:
  365. Type = ELF::R_PPC64_TPREL16_LO_DS;
  366. break;
  367. case MCSymbolRefExpr::VK_DTPREL:
  368. Type = ELF::R_PPC64_DTPREL16_DS;
  369. break;
  370. case MCSymbolRefExpr::VK_PPC_DTPREL_LO:
  371. Type = ELF::R_PPC64_DTPREL16_LO_DS;
  372. break;
  373. case MCSymbolRefExpr::VK_PPC_GOT_TPREL:
  374. Type = ELF::R_PPC64_GOT_TPREL16_DS;
  375. break;
  376. case MCSymbolRefExpr::VK_PPC_GOT_TPREL_LO:
  377. Type = ELF::R_PPC64_GOT_TPREL16_LO_DS;
  378. break;
  379. case MCSymbolRefExpr::VK_PPC_GOT_DTPREL:
  380. Type = ELF::R_PPC64_GOT_DTPREL16_DS;
  381. break;
  382. case MCSymbolRefExpr::VK_PPC_GOT_DTPREL_LO:
  383. Type = ELF::R_PPC64_GOT_DTPREL16_LO_DS;
  384. break;
  385. }
  386. break;
  387. case PPC::fixup_ppc_nofixup:
  388. switch (Modifier) {
  389. default: llvm_unreachable("Unsupported Modifier");
  390. case MCSymbolRefExpr::VK_PPC_TLSGD:
  391. if (is64Bit())
  392. Type = ELF::R_PPC64_TLSGD;
  393. else
  394. Type = ELF::R_PPC_TLSGD;
  395. break;
  396. case MCSymbolRefExpr::VK_PPC_TLSLD:
  397. if (is64Bit())
  398. Type = ELF::R_PPC64_TLSLD;
  399. else
  400. Type = ELF::R_PPC_TLSLD;
  401. break;
  402. case MCSymbolRefExpr::VK_PPC_TLS:
  403. if (is64Bit())
  404. Type = ELF::R_PPC64_TLS;
  405. else
  406. Type = ELF::R_PPC_TLS;
  407. break;
  408. case MCSymbolRefExpr::VK_PPC_TLS_PCREL:
  409. Type = ELF::R_PPC64_TLS;
  410. break;
  411. }
  412. break;
  413. case PPC::fixup_ppc_imm34:
  414. switch (Modifier) {
  415. default:
  416. report_fatal_error("Unsupported Modifier for fixup_ppc_imm34.");
  417. case MCSymbolRefExpr::VK_DTPREL:
  418. Type = ELF::R_PPC64_DTPREL34;
  419. break;
  420. case MCSymbolRefExpr::VK_TPREL:
  421. Type = ELF::R_PPC64_TPREL34;
  422. break;
  423. }
  424. break;
  425. case FK_Data_8:
  426. switch (Modifier) {
  427. default: llvm_unreachable("Unsupported Modifier");
  428. case MCSymbolRefExpr::VK_PPC_TOCBASE:
  429. Type = ELF::R_PPC64_TOC;
  430. break;
  431. case MCSymbolRefExpr::VK_None:
  432. Type = ELF::R_PPC64_ADDR64;
  433. break;
  434. case MCSymbolRefExpr::VK_PPC_DTPMOD:
  435. Type = ELF::R_PPC64_DTPMOD64;
  436. break;
  437. case MCSymbolRefExpr::VK_TPREL:
  438. Type = ELF::R_PPC64_TPREL64;
  439. break;
  440. case MCSymbolRefExpr::VK_DTPREL:
  441. Type = ELF::R_PPC64_DTPREL64;
  442. break;
  443. }
  444. break;
  445. case FK_Data_4:
  446. Type = ELF::R_PPC_ADDR32;
  447. break;
  448. case FK_Data_2:
  449. Type = ELF::R_PPC_ADDR16;
  450. break;
  451. }
  452. }
  453. return Type;
  454. }
  455. bool PPCELFObjectWriter::needsRelocateWithSymbol(const MCSymbol &Sym,
  456. unsigned Type) const {
  457. switch (Type) {
  458. default:
  459. return false;
  460. case ELF::R_PPC_REL24:
  461. case ELF::R_PPC64_REL24_NOTOC:
  462. // If the target symbol has a local entry point, we must keep the
  463. // target symbol to preserve that information for the linker.
  464. // The "other" values are stored in the last 6 bits of the second byte.
  465. // The traditional defines for STO values assume the full byte and thus
  466. // the shift to pack it.
  467. unsigned Other = cast<MCSymbolELF>(Sym).getOther() << 2;
  468. return (Other & ELF::STO_PPC64_LOCAL_MASK) != 0;
  469. }
  470. }
  471. std::unique_ptr<MCObjectTargetWriter>
  472. llvm::createPPCELFObjectWriter(bool Is64Bit, uint8_t OSABI) {
  473. return std::make_unique<PPCELFObjectWriter>(Is64Bit, OSABI);
  474. }