aot_llvm_extra2.cpp 4.2 KB

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