aot_llvm_extra2.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. #if LLVM_VERSION_MAJOR >= 14
  9. #include <llvm/MC/TargetRegistry.h>
  10. #else
  11. #include <llvm/Support/TargetRegistry.h>
  12. #endif
  13. #include <llvm/Target/TargetMachine.h>
  14. #include "bh_assert.h"
  15. #include "aot_llvm_extra2.h"
  16. static llvm::Optional<llvm::Reloc::Model>
  17. convert(LLVMRelocMode reloc_mode)
  18. {
  19. switch (reloc_mode) {
  20. case LLVMRelocDefault:
  21. return llvm::None;
  22. case LLVMRelocStatic:
  23. return llvm::Reloc::Static;
  24. case LLVMRelocPIC:
  25. return llvm::Reloc::PIC_;
  26. case LLVMRelocDynamicNoPic:
  27. return llvm::Reloc::DynamicNoPIC;
  28. case LLVMRelocROPI:
  29. return llvm::Reloc::ROPI;
  30. case LLVMRelocRWPI:
  31. return llvm::Reloc::RWPI;
  32. case LLVMRelocROPI_RWPI:
  33. return llvm::Reloc::ROPI_RWPI;
  34. }
  35. bh_assert(0);
  36. return llvm::None;
  37. }
  38. static llvm::CodeGenOpt::Level
  39. convert(LLVMCodeGenOptLevel opt_level)
  40. {
  41. switch (opt_level) {
  42. case LLVMCodeGenLevelNone:
  43. return llvm::CodeGenOpt::None;
  44. case LLVMCodeGenLevelLess:
  45. return llvm::CodeGenOpt::Less;
  46. case LLVMCodeGenLevelDefault:
  47. return llvm::CodeGenOpt::Default;
  48. case LLVMCodeGenLevelAggressive:
  49. return llvm::CodeGenOpt::Aggressive;
  50. }
  51. bh_assert(0);
  52. return llvm::CodeGenOpt::None;
  53. }
  54. static llvm::Optional<llvm::CodeModel::Model>
  55. convert(LLVMCodeModel code_model, bool *jit)
  56. {
  57. *jit = false;
  58. switch (code_model) {
  59. case LLVMCodeModelDefault:
  60. return llvm::None;
  61. case LLVMCodeModelJITDefault:
  62. *jit = true;
  63. return llvm::None;
  64. case LLVMCodeModelTiny:
  65. return llvm::CodeModel::Tiny;
  66. case LLVMCodeModelSmall:
  67. return llvm::CodeModel::Small;
  68. case LLVMCodeModelKernel:
  69. return llvm::CodeModel::Kernel;
  70. case LLVMCodeModelMedium:
  71. return llvm::CodeModel::Medium;
  72. case LLVMCodeModelLarge:
  73. return llvm::CodeModel::Large;
  74. }
  75. bh_assert(0);
  76. return llvm::None;
  77. }
  78. LLVMTargetMachineRef
  79. LLVMCreateTargetMachineWithOpts(LLVMTargetRef ctarget, const char *triple,
  80. const char *cpu, const char *features,
  81. LLVMCodeGenOptLevel opt_level,
  82. LLVMRelocMode reloc_mode,
  83. LLVMCodeModel code_model,
  84. bool EmitStackSizeSection,
  85. const char *StackUsageOutput)
  86. {
  87. llvm::TargetOptions opts;
  88. // -fstack-size-section equiv
  89. // emit it to ".stack_sizes" section in case of ELF
  90. // you can read it with "llvm-readobj --stack-sizes"
  91. opts.EmitStackSizeSection = EmitStackSizeSection;
  92. // -fstack-usage equiv
  93. if (StackUsageOutput != NULL) {
  94. opts.StackUsageOutput = StackUsageOutput;
  95. }
  96. auto target = reinterpret_cast<llvm::Target *>(ctarget);
  97. auto rm = convert(reloc_mode);
  98. auto ol = convert(opt_level);
  99. bool jit;
  100. auto cm = convert(code_model, &jit);
  101. auto targetmachine = target->createTargetMachine(triple, cpu, features,
  102. opts, rm, cm, ol, jit);
  103. return reinterpret_cast<LLVMTargetMachineRef>(targetmachine);
  104. }