aot_llvm_extra2.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * Copyright (c)2023 YAMAMOTO Takashi. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include <llvm-c/TargetMachine.h>
  6. #if LLVM_VERSION_MAJOR < 17
  7. #include <llvm/ADT/None.h>
  8. #include <llvm/ADT/Optional.h>
  9. #endif
  10. #include <llvm/IR/Instructions.h>
  11. #if LLVM_VERSION_MAJOR >= 14
  12. #include <llvm/MC/TargetRegistry.h>
  13. #else
  14. #include <llvm/Support/TargetRegistry.h>
  15. #endif
  16. #include <llvm/Target/TargetMachine.h>
  17. #include "bh_assert.h"
  18. #include "aot_llvm_extra2.h"
  19. #if LLVM_VERSION_MAJOR >= 17
  20. namespace llvm {
  21. template<typename T>
  22. using Optional = std::optional<T>;
  23. }
  24. #endif
  25. static llvm::Optional<llvm::Reloc::Model>
  26. convert(LLVMRelocMode reloc_mode)
  27. {
  28. switch (reloc_mode) {
  29. case LLVMRelocDefault:
  30. #if LLVM_VERSION_MAJOR >= 16
  31. return std::nullopt;
  32. #else
  33. return llvm::None;
  34. #endif
  35. case LLVMRelocStatic:
  36. return llvm::Reloc::Static;
  37. case LLVMRelocPIC:
  38. return llvm::Reloc::PIC_;
  39. case LLVMRelocDynamicNoPic:
  40. return llvm::Reloc::DynamicNoPIC;
  41. case LLVMRelocROPI:
  42. return llvm::Reloc::ROPI;
  43. case LLVMRelocRWPI:
  44. return llvm::Reloc::RWPI;
  45. case LLVMRelocROPI_RWPI:
  46. return llvm::Reloc::ROPI_RWPI;
  47. }
  48. bh_assert(0);
  49. #if LLVM_VERSION_MAJOR >= 16
  50. return std::nullopt;
  51. #else
  52. return llvm::None;
  53. #endif
  54. }
  55. static llvm::CodeGenOpt::Level
  56. convert(LLVMCodeGenOptLevel opt_level)
  57. {
  58. switch (opt_level) {
  59. case LLVMCodeGenLevelNone:
  60. return llvm::CodeGenOpt::None;
  61. case LLVMCodeGenLevelLess:
  62. return llvm::CodeGenOpt::Less;
  63. case LLVMCodeGenLevelDefault:
  64. return llvm::CodeGenOpt::Default;
  65. case LLVMCodeGenLevelAggressive:
  66. return llvm::CodeGenOpt::Aggressive;
  67. }
  68. bh_assert(0);
  69. return llvm::CodeGenOpt::None;
  70. }
  71. static llvm::Optional<llvm::CodeModel::Model>
  72. convert(LLVMCodeModel code_model, bool *jit)
  73. {
  74. *jit = false;
  75. switch (code_model) {
  76. case LLVMCodeModelDefault:
  77. #if LLVM_VERSION_MAJOR >= 16
  78. return std::nullopt;
  79. #else
  80. return llvm::None;
  81. #endif
  82. case LLVMCodeModelJITDefault:
  83. *jit = true;
  84. #if LLVM_VERSION_MAJOR >= 16
  85. return std::nullopt;
  86. #else
  87. return llvm::None;
  88. #endif
  89. case LLVMCodeModelTiny:
  90. return llvm::CodeModel::Tiny;
  91. case LLVMCodeModelSmall:
  92. return llvm::CodeModel::Small;
  93. case LLVMCodeModelKernel:
  94. return llvm::CodeModel::Kernel;
  95. case LLVMCodeModelMedium:
  96. return llvm::CodeModel::Medium;
  97. case LLVMCodeModelLarge:
  98. return llvm::CodeModel::Large;
  99. }
  100. bh_assert(0);
  101. #if LLVM_VERSION_MAJOR >= 16
  102. return std::nullopt;
  103. #else
  104. return llvm::None;
  105. #endif
  106. }
  107. LLVMTargetMachineRef
  108. LLVMCreateTargetMachineWithOpts(LLVMTargetRef ctarget, const char *triple,
  109. const char *cpu, const char *features,
  110. LLVMCodeGenOptLevel opt_level,
  111. LLVMRelocMode reloc_mode,
  112. LLVMCodeModel code_model,
  113. bool EmitStackSizeSection,
  114. const char *StackUsageOutput)
  115. {
  116. llvm::TargetOptions opts;
  117. // -fstack-size-section equiv
  118. // emit it to ".stack_sizes" section in case of ELF
  119. // you can read it with "llvm-readobj --stack-sizes"
  120. opts.EmitStackSizeSection = EmitStackSizeSection;
  121. // -fstack-usage equiv
  122. if (StackUsageOutput != NULL) {
  123. opts.StackUsageOutput = StackUsageOutput;
  124. }
  125. auto target = reinterpret_cast<llvm::Target *>(ctarget);
  126. auto rm = convert(reloc_mode);
  127. auto ol = convert(opt_level);
  128. bool jit;
  129. auto cm = convert(code_model, &jit);
  130. auto targetmachine = target->createTargetMachine(triple, cpu, features,
  131. opts, rm, cm, ol, jit);
  132. return reinterpret_cast<LLVMTargetMachineRef>(targetmachine);
  133. }
  134. /* https://reviews.llvm.org/D153107 */
  135. #if LLVM_VERSION_MAJOR < 17
  136. using namespace llvm;
  137. LLVMTailCallKind
  138. LLVMGetTailCallKind(LLVMValueRef Call)
  139. {
  140. return (LLVMTailCallKind)unwrap<CallInst>(Call)->getTailCallKind();
  141. }
  142. void
  143. LLVMSetTailCallKind(LLVMValueRef Call, LLVMTailCallKind kind)
  144. {
  145. unwrap<CallInst>(Call)->setTailCallKind((CallInst::TailCallKind)kind);
  146. }
  147. #endif