aot_llvm_extra2.cpp 3.8 KB

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