diff options
| author | fee1-dead <ent3rm4n@gmail.com> | 2023-07-06 09:20:31 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-06 09:20:31 +0800 |
| commit | e461502e06b171c05d4730b4d1a2846a1e5847fa (patch) | |
| tree | 40e3cce514efa8d9ec9a9b9dc076fca91886527a /compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp | |
| parent | 6e9bdacaf9ec183df9c3027c33775fee868f8435 (diff) | |
| parent | bf5eaa45506bbaa5fe9322c4e114d89fd87ad5f4 (diff) | |
| download | rust-e461502e06b171c05d4730b4d1a2846a1e5847fa.tar.gz rust-e461502e06b171c05d4730b4d1a2846a1e5847fa.zip | |
Rollup merge of #112791 - WaffleLapkin:wag_the_llvm, r=cuviper
llvm ffi: Expose `CallInst->setTailCallKind` This is needed for the explicit tail calls experiment.
Diffstat (limited to 'compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp')
| -rw-r--r-- | compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp index 553fe6cf087..bb7510b3a53 100644 --- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp @@ -121,6 +121,32 @@ extern "C" LLVMValueRef LLVMRustGetNamedValue(LLVMModuleRef M, const char *Name, return wrap(unwrap(M)->getNamedValue(StringRef(Name, NameLen))); } +enum class LLVMRustTailCallKind { + None, + Tail, + MustTail, + NoTail, +}; + +static CallInst::TailCallKind fromRust(LLVMRustTailCallKind Kind) { + switch (Kind) { + case LLVMRustTailCallKind::None: + return CallInst::TailCallKind::TCK_None; + case LLVMRustTailCallKind::Tail: + return CallInst::TailCallKind::TCK_Tail; + case LLVMRustTailCallKind::MustTail: + return CallInst::TailCallKind::TCK_MustTail; + case LLVMRustTailCallKind::NoTail: + return CallInst::TailCallKind::TCK_NoTail; + default: + report_fatal_error("bad CallInst::TailCallKind."); + } +} + +extern "C" void LLVMRustSetTailCallKind(LLVMValueRef Call, LLVMRustTailCallKind TCK) { + unwrap<CallInst>(Call)->setTailCallKind(fromRust(TCK)); +} + extern "C" LLVMValueRef LLVMRustGetOrInsertFunction(LLVMModuleRef M, const char *Name, size_t NameLen, |
