mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Auto merge of #109862 - klensy:llvm-dd, r=nikic
llvm: replace some deprecated functions, add fixmes Replace some deprecated llvm functions, add FIXME's (for simpler future work), replace some rust custom functions with llvm ones.
This commit is contained in:
commit
dd2b19539e
@ -381,7 +381,7 @@ impl<'tcx> AsmMethods<'tcx> for CodegenCx<'_, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMRustAppendModuleInlineAsm(
|
llvm::LLVMAppendModuleInlineAsm(
|
||||||
self.llmod,
|
self.llmod,
|
||||||
template_str.as_ptr().cast(),
|
template_str.as_ptr().cast(),
|
||||||
template_str.len(),
|
template_str.len(),
|
||||||
|
@ -904,9 +904,9 @@ unsafe fn embed_bitcode(
|
|||||||
// We need custom section flags, so emit module-level inline assembly.
|
// We need custom section flags, so emit module-level inline assembly.
|
||||||
let section_flags = if cgcx.is_pe_coff { "n" } else { "e" };
|
let section_flags = if cgcx.is_pe_coff { "n" } else { "e" };
|
||||||
let asm = create_section_with_flags_asm(".llvmbc", section_flags, bitcode);
|
let asm = create_section_with_flags_asm(".llvmbc", section_flags, bitcode);
|
||||||
llvm::LLVMRustAppendModuleInlineAsm(llmod, asm.as_ptr().cast(), asm.len());
|
llvm::LLVMAppendModuleInlineAsm(llmod, asm.as_ptr().cast(), asm.len());
|
||||||
let asm = create_section_with_flags_asm(".llvmcmd", section_flags, cmdline.as_bytes());
|
let asm = create_section_with_flags_asm(".llvmcmd", section_flags, cmdline.as_bytes());
|
||||||
llvm::LLVMRustAppendModuleInlineAsm(llmod, asm.as_ptr().cast(), asm.len());
|
llvm::LLVMAppendModuleInlineAsm(llmod, asm.as_ptr().cast(), asm.len());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ use crate::abi::FnAbiLlvmExt;
|
|||||||
use crate::attributes;
|
use crate::attributes;
|
||||||
use crate::common::Funclet;
|
use crate::common::Funclet;
|
||||||
use crate::context::CodegenCx;
|
use crate::context::CodegenCx;
|
||||||
use crate::llvm::{self, AtomicOrdering, AtomicRmwBinOp, BasicBlock};
|
use crate::llvm::{self, AtomicOrdering, AtomicRmwBinOp, BasicBlock, False, True};
|
||||||
use crate::type_::Type;
|
use crate::type_::Type;
|
||||||
use crate::type_of::LayoutLlvmExt;
|
use crate::type_of::LayoutLlvmExt;
|
||||||
use crate::value::Value;
|
use crate::value::Value;
|
||||||
@ -841,7 +841,15 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn intcast(&mut self, val: &'ll Value, dest_ty: &'ll Type, is_signed: bool) -> &'ll Value {
|
fn intcast(&mut self, val: &'ll Value, dest_ty: &'ll Type, is_signed: bool) -> &'ll Value {
|
||||||
unsafe { llvm::LLVMRustBuildIntCast(self.llbuilder, val, dest_ty, is_signed) }
|
unsafe {
|
||||||
|
llvm::LLVMBuildIntCast2(
|
||||||
|
self.llbuilder,
|
||||||
|
val,
|
||||||
|
dest_ty,
|
||||||
|
if is_signed { True } else { False },
|
||||||
|
UNNAMED,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pointercast(&mut self, val: &'ll Value, dest_ty: &'ll Type) -> &'ll Value {
|
fn pointercast(&mut self, val: &'ll Value, dest_ty: &'ll Type) -> &'ll Value {
|
||||||
@ -1001,11 +1009,11 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
fn cleanup_pad(&mut self, parent: Option<&'ll Value>, args: &[&'ll Value]) -> Funclet<'ll> {
|
fn cleanup_pad(&mut self, parent: Option<&'ll Value>, args: &[&'ll Value]) -> Funclet<'ll> {
|
||||||
let name = cstr!("cleanuppad");
|
let name = cstr!("cleanuppad");
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
llvm::LLVMRustBuildCleanupPad(
|
llvm::LLVMBuildCleanupPad(
|
||||||
self.llbuilder,
|
self.llbuilder,
|
||||||
parent,
|
parent,
|
||||||
args.len() as c_uint,
|
|
||||||
args.as_ptr(),
|
args.as_ptr(),
|
||||||
|
args.len() as c_uint,
|
||||||
name.as_ptr(),
|
name.as_ptr(),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@ -1014,7 +1022,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
|
|
||||||
fn cleanup_ret(&mut self, funclet: &Funclet<'ll>, unwind: Option<&'ll BasicBlock>) {
|
fn cleanup_ret(&mut self, funclet: &Funclet<'ll>, unwind: Option<&'ll BasicBlock>) {
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMRustBuildCleanupRet(self.llbuilder, funclet.cleanuppad(), unwind)
|
llvm::LLVMBuildCleanupRet(self.llbuilder, funclet.cleanuppad(), unwind)
|
||||||
.expect("LLVM does not have support for cleanupret");
|
.expect("LLVM does not have support for cleanupret");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1022,11 +1030,11 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
fn catch_pad(&mut self, parent: &'ll Value, args: &[&'ll Value]) -> Funclet<'ll> {
|
fn catch_pad(&mut self, parent: &'ll Value, args: &[&'ll Value]) -> Funclet<'ll> {
|
||||||
let name = cstr!("catchpad");
|
let name = cstr!("catchpad");
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
llvm::LLVMRustBuildCatchPad(
|
llvm::LLVMBuildCatchPad(
|
||||||
self.llbuilder,
|
self.llbuilder,
|
||||||
parent,
|
parent,
|
||||||
args.len() as c_uint,
|
|
||||||
args.as_ptr(),
|
args.as_ptr(),
|
||||||
|
args.len() as c_uint,
|
||||||
name.as_ptr(),
|
name.as_ptr(),
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
@ -1041,7 +1049,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
) -> &'ll Value {
|
) -> &'ll Value {
|
||||||
let name = cstr!("catchswitch");
|
let name = cstr!("catchswitch");
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
llvm::LLVMRustBuildCatchSwitch(
|
llvm::LLVMBuildCatchSwitch(
|
||||||
self.llbuilder,
|
self.llbuilder,
|
||||||
parent,
|
parent,
|
||||||
unwind,
|
unwind,
|
||||||
@ -1052,7 +1060,7 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
let ret = ret.expect("LLVM does not have support for catchswitch");
|
let ret = ret.expect("LLVM does not have support for catchswitch");
|
||||||
for handler in handlers {
|
for handler in handlers {
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMRustAddHandler(ret, handler);
|
llvm::LLVMAddHandler(ret, handler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret
|
ret
|
||||||
@ -1376,8 +1384,7 @@ impl<'a, 'll, 'tcx> Builder<'a, 'll, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn catch_ret(&mut self, funclet: &Funclet<'ll>, unwind: &'ll BasicBlock) -> &'ll Value {
|
pub fn catch_ret(&mut self, funclet: &Funclet<'ll>, unwind: &'ll BasicBlock) -> &'ll Value {
|
||||||
let ret =
|
let ret = unsafe { llvm::LLVMBuildCatchRet(self.llbuilder, funclet.cleanuppad(), unwind) };
|
||||||
unsafe { llvm::LLVMRustBuildCatchRet(self.llbuilder, funclet.cleanuppad(), unwind) };
|
|
||||||
ret.expect("LLVM does not have support for catchret")
|
ret.expect("LLVM does not have support for catchret")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ use crate::type_::Type;
|
|||||||
use crate::type_of::LayoutLlvmExt;
|
use crate::type_of::LayoutLlvmExt;
|
||||||
use crate::value::Value;
|
use crate::value::Value;
|
||||||
use cstr::cstr;
|
use cstr::cstr;
|
||||||
use libc::c_uint;
|
|
||||||
use rustc_codegen_ssa::traits::*;
|
use rustc_codegen_ssa::traits::*;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
|
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
|
||||||
@ -486,10 +485,10 @@ impl<'ll> StaticMethods for CodegenCx<'ll, '_> {
|
|||||||
// go into custom sections of the wasm executable.
|
// go into custom sections of the wasm executable.
|
||||||
if self.tcx.sess.target.is_like_wasm {
|
if self.tcx.sess.target.is_like_wasm {
|
||||||
if let Some(section) = attrs.link_section {
|
if let Some(section) = attrs.link_section {
|
||||||
let section = llvm::LLVMMDStringInContext(
|
let section = llvm::LLVMMDStringInContext2(
|
||||||
self.llcx,
|
self.llcx,
|
||||||
section.as_str().as_ptr().cast(),
|
section.as_str().as_ptr().cast(),
|
||||||
section.as_str().len() as c_uint,
|
section.as_str().len(),
|
||||||
);
|
);
|
||||||
assert!(alloc.provenance().ptrs().is_empty());
|
assert!(alloc.provenance().ptrs().is_empty());
|
||||||
|
|
||||||
@ -498,17 +497,15 @@ impl<'ll> StaticMethods for CodegenCx<'ll, '_> {
|
|||||||
// as part of the interpreter execution).
|
// as part of the interpreter execution).
|
||||||
let bytes =
|
let bytes =
|
||||||
alloc.inspect_with_uninit_and_ptr_outside_interpreter(0..alloc.len());
|
alloc.inspect_with_uninit_and_ptr_outside_interpreter(0..alloc.len());
|
||||||
let alloc = llvm::LLVMMDStringInContext(
|
let alloc =
|
||||||
self.llcx,
|
llvm::LLVMMDStringInContext2(self.llcx, bytes.as_ptr().cast(), bytes.len());
|
||||||
bytes.as_ptr().cast(),
|
|
||||||
bytes.len() as c_uint,
|
|
||||||
);
|
|
||||||
let data = [section, alloc];
|
let data = [section, alloc];
|
||||||
let meta = llvm::LLVMMDNodeInContext(self.llcx, data.as_ptr(), 2);
|
let meta = llvm::LLVMMDNodeInContext2(self.llcx, data.as_ptr(), data.len());
|
||||||
|
let val = llvm::LLVMMetadataAsValue(self.llcx, meta);
|
||||||
llvm::LLVMAddNamedMetadataOperand(
|
llvm::LLVMAddNamedMetadataOperand(
|
||||||
self.llmod,
|
self.llmod,
|
||||||
"wasm.custom_sections\0".as_ptr().cast(),
|
"wasm.custom_sections\0".as_ptr().cast(),
|
||||||
meta,
|
val,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -864,8 +864,6 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
|
|||||||
);
|
);
|
||||||
|
|
||||||
if tcx.sess.opts.unstable_opts.profile {
|
if tcx.sess.opts.unstable_opts.profile {
|
||||||
let cu_desc_metadata =
|
|
||||||
llvm::LLVMRustMetadataAsValue(debug_context.llcontext, unit_metadata);
|
|
||||||
let default_gcda_path = &output_filenames.with_extension("gcda");
|
let default_gcda_path = &output_filenames.with_extension("gcda");
|
||||||
let gcda_path =
|
let gcda_path =
|
||||||
tcx.sess.opts.unstable_opts.profile_emit.as_ref().unwrap_or(default_gcda_path);
|
tcx.sess.opts.unstable_opts.profile_emit.as_ref().unwrap_or(default_gcda_path);
|
||||||
@ -873,20 +871,17 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
|
|||||||
let gcov_cu_info = [
|
let gcov_cu_info = [
|
||||||
path_to_mdstring(debug_context.llcontext, &output_filenames.with_extension("gcno")),
|
path_to_mdstring(debug_context.llcontext, &output_filenames.with_extension("gcno")),
|
||||||
path_to_mdstring(debug_context.llcontext, gcda_path),
|
path_to_mdstring(debug_context.llcontext, gcda_path),
|
||||||
cu_desc_metadata,
|
unit_metadata,
|
||||||
];
|
];
|
||||||
let gcov_metadata = llvm::LLVMMDNodeInContext(
|
let gcov_metadata = llvm::LLVMMDNodeInContext2(
|
||||||
debug_context.llcontext,
|
debug_context.llcontext,
|
||||||
gcov_cu_info.as_ptr(),
|
gcov_cu_info.as_ptr(),
|
||||||
gcov_cu_info.len() as c_uint,
|
gcov_cu_info.len(),
|
||||||
);
|
);
|
||||||
|
let val = llvm::LLVMMetadataAsValue(debug_context.llcontext, gcov_metadata);
|
||||||
|
|
||||||
let llvm_gcov_ident = cstr!("llvm.gcov");
|
let llvm_gcov_ident = cstr!("llvm.gcov");
|
||||||
llvm::LLVMAddNamedMetadataOperand(
|
llvm::LLVMAddNamedMetadataOperand(debug_context.llmod, llvm_gcov_ident.as_ptr(), val);
|
||||||
debug_context.llmod,
|
|
||||||
llvm_gcov_ident.as_ptr(),
|
|
||||||
gcov_metadata,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert `llvm.ident` metadata on the wasm targets since that will
|
// Insert `llvm.ident` metadata on the wasm targets since that will
|
||||||
@ -907,15 +902,9 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
|
|||||||
return unit_metadata;
|
return unit_metadata;
|
||||||
};
|
};
|
||||||
|
|
||||||
fn path_to_mdstring<'ll>(llcx: &'ll llvm::Context, path: &Path) -> &'ll Value {
|
fn path_to_mdstring<'ll>(llcx: &'ll llvm::Context, path: &Path) -> &'ll llvm::Metadata {
|
||||||
let path_str = path_to_c_string(path);
|
let path_str = path_to_c_string(path);
|
||||||
unsafe {
|
unsafe { llvm::LLVMMDStringInContext2(llcx, path_str.as_ptr(), path_str.as_bytes().len()) }
|
||||||
llvm::LLVMMDStringInContext(
|
|
||||||
llcx,
|
|
||||||
path_str.as_ptr(),
|
|
||||||
path_str.as_bytes().len() as c_uint,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,8 +209,7 @@ impl<'ll> DebugInfoBuilderMethods for Builder<'_, 'll, '_> {
|
|||||||
|
|
||||||
fn set_dbg_loc(&mut self, dbg_loc: &'ll DILocation) {
|
fn set_dbg_loc(&mut self, dbg_loc: &'ll DILocation) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let dbg_loc_as_llval = llvm::LLVMRustMetadataAsValue(self.cx().llcx, dbg_loc);
|
llvm::LLVMSetCurrentDebugLocation2(self.llbuilder, dbg_loc);
|
||||||
llvm::LLVMSetCurrentDebugLocation(self.llbuilder, dbg_loc_as_llval);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1018,7 +1018,7 @@ extern "C" {
|
|||||||
pub fn LLVMSetDataLayout(M: &Module, Triple: *const c_char);
|
pub fn LLVMSetDataLayout(M: &Module, Triple: *const c_char);
|
||||||
|
|
||||||
/// See Module::setModuleInlineAsm.
|
/// See Module::setModuleInlineAsm.
|
||||||
pub fn LLVMRustAppendModuleInlineAsm(M: &Module, Asm: *const c_char, AsmLen: size_t);
|
pub fn LLVMAppendModuleInlineAsm(M: &Module, Asm: *const c_char, Len: size_t);
|
||||||
|
|
||||||
/// See llvm::LLVMTypeKind::getTypeID.
|
/// See llvm::LLVMTypeKind::getTypeID.
|
||||||
pub fn LLVMRustGetTypeKind(Ty: &Type) -> TypeKind;
|
pub fn LLVMRustGetTypeKind(Ty: &Type) -> TypeKind;
|
||||||
@ -1065,7 +1065,7 @@ extern "C" {
|
|||||||
|
|
||||||
// Operations on other types
|
// Operations on other types
|
||||||
pub fn LLVMVoidTypeInContext(C: &Context) -> &Type;
|
pub fn LLVMVoidTypeInContext(C: &Context) -> &Type;
|
||||||
pub fn LLVMRustMetadataTypeInContext(C: &Context) -> &Type;
|
pub fn LLVMMetadataTypeInContext(C: &Context) -> &Type;
|
||||||
|
|
||||||
// Operations on all values
|
// Operations on all values
|
||||||
pub fn LLVMTypeOf(Val: &Value) -> &Type;
|
pub fn LLVMTypeOf(Val: &Value) -> &Type;
|
||||||
@ -1084,7 +1084,12 @@ extern "C" {
|
|||||||
pub fn LLVMGetPoison(Ty: &Type) -> &Value;
|
pub fn LLVMGetPoison(Ty: &Type) -> &Value;
|
||||||
|
|
||||||
// Operations on metadata
|
// Operations on metadata
|
||||||
|
// FIXME: deprecated, replace with LLVMMDStringInContext2
|
||||||
pub fn LLVMMDStringInContext(C: &Context, Str: *const c_char, SLen: c_uint) -> &Value;
|
pub fn LLVMMDStringInContext(C: &Context, Str: *const c_char, SLen: c_uint) -> &Value;
|
||||||
|
|
||||||
|
pub fn LLVMMDStringInContext2(C: &Context, Str: *const c_char, SLen: size_t) -> &Metadata;
|
||||||
|
|
||||||
|
// FIXME: deprecated, replace with LLVMMDNodeInContext2
|
||||||
pub fn LLVMMDNodeInContext<'a>(
|
pub fn LLVMMDNodeInContext<'a>(
|
||||||
C: &'a Context,
|
C: &'a Context,
|
||||||
Vals: *const &'a Value,
|
Vals: *const &'a Value,
|
||||||
@ -1123,6 +1128,8 @@ extern "C" {
|
|||||||
Packed: Bool,
|
Packed: Bool,
|
||||||
) -> &'a Value;
|
) -> &'a Value;
|
||||||
|
|
||||||
|
// FIXME: replace with LLVMConstArray2 when bumped minimal version to llvm-17
|
||||||
|
// https://github.com/llvm/llvm-project/commit/35276f16e5a2cae0dfb49c0fbf874d4d2f177acc
|
||||||
pub fn LLVMConstArray<'a>(
|
pub fn LLVMConstArray<'a>(
|
||||||
ElementTy: &'a Type,
|
ElementTy: &'a Type,
|
||||||
ConstantVals: *const &'a Value,
|
ConstantVals: *const &'a Value,
|
||||||
@ -1262,7 +1269,7 @@ extern "C" {
|
|||||||
pub fn LLVMDisposeBuilder<'a>(Builder: &'a mut Builder<'a>);
|
pub fn LLVMDisposeBuilder<'a>(Builder: &'a mut Builder<'a>);
|
||||||
|
|
||||||
// Metadata
|
// Metadata
|
||||||
pub fn LLVMSetCurrentDebugLocation<'a>(Builder: &Builder<'a>, L: &'a Value);
|
pub fn LLVMSetCurrentDebugLocation2<'a>(Builder: &Builder<'a>, Loc: &'a Metadata);
|
||||||
|
|
||||||
// Terminators
|
// Terminators
|
||||||
pub fn LLVMBuildRetVoid<'a>(B: &Builder<'a>) -> &'a Value;
|
pub fn LLVMBuildRetVoid<'a>(B: &Builder<'a>) -> &'a Value;
|
||||||
@ -1302,38 +1309,38 @@ extern "C" {
|
|||||||
pub fn LLVMBuildResume<'a>(B: &Builder<'a>, Exn: &'a Value) -> &'a Value;
|
pub fn LLVMBuildResume<'a>(B: &Builder<'a>, Exn: &'a Value) -> &'a Value;
|
||||||
pub fn LLVMBuildUnreachable<'a>(B: &Builder<'a>) -> &'a Value;
|
pub fn LLVMBuildUnreachable<'a>(B: &Builder<'a>) -> &'a Value;
|
||||||
|
|
||||||
pub fn LLVMRustBuildCleanupPad<'a>(
|
pub fn LLVMBuildCleanupPad<'a>(
|
||||||
B: &Builder<'a>,
|
B: &Builder<'a>,
|
||||||
ParentPad: Option<&'a Value>,
|
ParentPad: Option<&'a Value>,
|
||||||
ArgCnt: c_uint,
|
|
||||||
Args: *const &'a Value,
|
Args: *const &'a Value,
|
||||||
|
NumArgs: c_uint,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
) -> Option<&'a Value>;
|
) -> Option<&'a Value>;
|
||||||
pub fn LLVMRustBuildCleanupRet<'a>(
|
pub fn LLVMBuildCleanupRet<'a>(
|
||||||
B: &Builder<'a>,
|
B: &Builder<'a>,
|
||||||
CleanupPad: &'a Value,
|
CleanupPad: &'a Value,
|
||||||
UnwindBB: Option<&'a BasicBlock>,
|
BB: Option<&'a BasicBlock>,
|
||||||
) -> Option<&'a Value>;
|
) -> Option<&'a Value>;
|
||||||
pub fn LLVMRustBuildCatchPad<'a>(
|
pub fn LLVMBuildCatchPad<'a>(
|
||||||
B: &Builder<'a>,
|
B: &Builder<'a>,
|
||||||
ParentPad: &'a Value,
|
ParentPad: &'a Value,
|
||||||
ArgCnt: c_uint,
|
|
||||||
Args: *const &'a Value,
|
Args: *const &'a Value,
|
||||||
|
NumArgs: c_uint,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
) -> Option<&'a Value>;
|
) -> Option<&'a Value>;
|
||||||
pub fn LLVMRustBuildCatchRet<'a>(
|
pub fn LLVMBuildCatchRet<'a>(
|
||||||
B: &Builder<'a>,
|
B: &Builder<'a>,
|
||||||
Pad: &'a Value,
|
CatchPad: &'a Value,
|
||||||
BB: &'a BasicBlock,
|
BB: &'a BasicBlock,
|
||||||
) -> Option<&'a Value>;
|
) -> Option<&'a Value>;
|
||||||
pub fn LLVMRustBuildCatchSwitch<'a>(
|
pub fn LLVMBuildCatchSwitch<'a>(
|
||||||
Builder: &Builder<'a>,
|
Builder: &Builder<'a>,
|
||||||
ParentPad: Option<&'a Value>,
|
ParentPad: Option<&'a Value>,
|
||||||
BB: Option<&'a BasicBlock>,
|
UnwindBB: Option<&'a BasicBlock>,
|
||||||
NumHandlers: c_uint,
|
NumHandlers: c_uint,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
) -> Option<&'a Value>;
|
) -> Option<&'a Value>;
|
||||||
pub fn LLVMRustAddHandler<'a>(CatchSwitch: &'a Value, Handler: &'a BasicBlock);
|
pub fn LLVMAddHandler<'a>(CatchSwitch: &'a Value, Dest: &'a BasicBlock);
|
||||||
pub fn LLVMSetPersonalityFn<'a>(Func: &'a Value, Pers: &'a Value);
|
pub fn LLVMSetPersonalityFn<'a>(Func: &'a Value, Pers: &'a Value);
|
||||||
|
|
||||||
// Add a case to the switch instruction
|
// Add a case to the switch instruction
|
||||||
@ -1627,11 +1634,12 @@ extern "C" {
|
|||||||
DestTy: &'a Type,
|
DestTy: &'a Type,
|
||||||
Name: *const c_char,
|
Name: *const c_char,
|
||||||
) -> &'a Value;
|
) -> &'a Value;
|
||||||
pub fn LLVMRustBuildIntCast<'a>(
|
pub fn LLVMBuildIntCast2<'a>(
|
||||||
B: &Builder<'a>,
|
B: &Builder<'a>,
|
||||||
Val: &'a Value,
|
Val: &'a Value,
|
||||||
DestTy: &'a Type,
|
DestTy: &'a Type,
|
||||||
IsSigned: bool,
|
IsSigned: Bool,
|
||||||
|
Name: *const c_char,
|
||||||
) -> &'a Value;
|
) -> &'a Value;
|
||||||
|
|
||||||
// Comparisons
|
// Comparisons
|
||||||
@ -1920,7 +1928,7 @@ extern "C" {
|
|||||||
);
|
);
|
||||||
pub fn LLVMRustHasModuleFlag(M: &Module, name: *const c_char, len: size_t) -> bool;
|
pub fn LLVMRustHasModuleFlag(M: &Module, name: *const c_char, len: size_t) -> bool;
|
||||||
|
|
||||||
pub fn LLVMRustMetadataAsValue<'a>(C: &'a Context, MD: &'a Metadata) -> &'a Value;
|
pub fn LLVMMetadataAsValue<'a>(C: &'a Context, MD: &'a Metadata) -> &'a Value;
|
||||||
|
|
||||||
pub fn LLVMRustDIBuilderCreate(M: &Module) -> &mut DIBuilder<'_>;
|
pub fn LLVMRustDIBuilderCreate(M: &Module) -> &mut DIBuilder<'_>;
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ impl<'ll> CodegenCx<'ll, '_> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn type_metadata(&self) -> &'ll Type {
|
pub(crate) fn type_metadata(&self) -> &'ll Type {
|
||||||
unsafe { llvm::LLVMRustMetadataTypeInContext(self.llcx) }
|
unsafe { llvm::LLVMMetadataTypeInContext(self.llcx) }
|
||||||
}
|
}
|
||||||
|
|
||||||
///x Creates an integer type with the given number of bits, e.g., i24
|
///x Creates an integer type with the given number of bits, e.g., i24
|
||||||
|
@ -152,10 +152,6 @@ LLVMRustInsertPrivateGlobal(LLVMModuleRef M, LLVMTypeRef Ty) {
|
|||||||
nullptr));
|
nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" LLVMTypeRef LLVMRustMetadataTypeInContext(LLVMContextRef C) {
|
|
||||||
return wrap(Type::getMetadataTy(*unwrap(C)));
|
|
||||||
}
|
|
||||||
|
|
||||||
static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) {
|
static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) {
|
||||||
switch (Kind) {
|
switch (Kind) {
|
||||||
case AlwaysInline:
|
case AlwaysInline:
|
||||||
@ -480,11 +476,6 @@ extern "C" bool LLVMRustInlineAsmVerify(LLVMTypeRef Ty, char *Constraints,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void LLVMRustAppendModuleInlineAsm(LLVMModuleRef M, const char *Asm,
|
|
||||||
size_t AsmLen) {
|
|
||||||
unwrap(M)->appendModuleInlineAsm(StringRef(Asm, AsmLen));
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef DIBuilder *LLVMRustDIBuilderRef;
|
typedef DIBuilder *LLVMRustDIBuilderRef;
|
||||||
|
|
||||||
template <typename DIT> DIT *unwrapDIPtr(LLVMMetadataRef Ref) {
|
template <typename DIT> DIT *unwrapDIPtr(LLVMMetadataRef Ref) {
|
||||||
@ -753,10 +744,6 @@ extern "C" bool LLVMRustHasModuleFlag(LLVMModuleRef M, const char *Name,
|
|||||||
return unwrap(M)->getModuleFlag(StringRef(Name, Len)) != nullptr;
|
return unwrap(M)->getModuleFlag(StringRef(Name, Len)) != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" LLVMValueRef LLVMRustMetadataAsValue(LLVMContextRef C, LLVMMetadataRef MD) {
|
|
||||||
return wrap(MetadataAsValue::get(*unwrap(C), unwrap(MD)));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void LLVMRustGlobalAddMetadata(
|
extern "C" void LLVMRustGlobalAddMetadata(
|
||||||
LLVMValueRef Global, unsigned Kind, LLVMMetadataRef MD) {
|
LLVMValueRef Global, unsigned Kind, LLVMMetadataRef MD) {
|
||||||
unwrap<GlobalObject>(Global)->addMetadata(Kind, *unwrap<MDNode>(MD));
|
unwrap<GlobalObject>(Global)->addMetadata(Kind, *unwrap<MDNode>(MD));
|
||||||
@ -1153,6 +1140,8 @@ extern "C" void LLVMRustWriteValueToString(LLVMValueRef V,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LLVMArrayType function does not support 64-bit ElementCount
|
// LLVMArrayType function does not support 64-bit ElementCount
|
||||||
|
// FIXME: replace with LLVMArrayType2 when bumped minimal version to llvm-17
|
||||||
|
// https://github.com/llvm/llvm-project/commit/35276f16e5a2cae0dfb49c0fbf874d4d2f177acc
|
||||||
extern "C" LLVMTypeRef LLVMRustArrayType(LLVMTypeRef ElementTy,
|
extern "C" LLVMTypeRef LLVMRustArrayType(LLVMTypeRef ElementTy,
|
||||||
uint64_t ElementCount) {
|
uint64_t ElementCount) {
|
||||||
return wrap(ArrayType::get(unwrap(ElementTy), ElementCount));
|
return wrap(ArrayType::get(unwrap(ElementTy), ElementCount));
|
||||||
@ -1408,61 +1397,6 @@ extern "C" bool LLVMRustUnpackSMDiagnostic(LLVMSMDiagnosticRef DRef,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" LLVMValueRef LLVMRustBuildCleanupPad(LLVMBuilderRef B,
|
|
||||||
LLVMValueRef ParentPad,
|
|
||||||
unsigned ArgCount,
|
|
||||||
LLVMValueRef *LLArgs,
|
|
||||||
const char *Name) {
|
|
||||||
Value **Args = unwrap(LLArgs);
|
|
||||||
if (ParentPad == nullptr) {
|
|
||||||
Type *Ty = Type::getTokenTy(unwrap(B)->getContext());
|
|
||||||
ParentPad = wrap(Constant::getNullValue(Ty));
|
|
||||||
}
|
|
||||||
return wrap(unwrap(B)->CreateCleanupPad(
|
|
||||||
unwrap(ParentPad), ArrayRef<Value *>(Args, ArgCount), Name));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" LLVMValueRef LLVMRustBuildCleanupRet(LLVMBuilderRef B,
|
|
||||||
LLVMValueRef CleanupPad,
|
|
||||||
LLVMBasicBlockRef UnwindBB) {
|
|
||||||
CleanupPadInst *Inst = cast<CleanupPadInst>(unwrap(CleanupPad));
|
|
||||||
return wrap(unwrap(B)->CreateCleanupRet(Inst, unwrap(UnwindBB)));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" LLVMValueRef
|
|
||||||
LLVMRustBuildCatchPad(LLVMBuilderRef B, LLVMValueRef ParentPad,
|
|
||||||
unsigned ArgCount, LLVMValueRef *LLArgs, const char *Name) {
|
|
||||||
Value **Args = unwrap(LLArgs);
|
|
||||||
return wrap(unwrap(B)->CreateCatchPad(
|
|
||||||
unwrap(ParentPad), ArrayRef<Value *>(Args, ArgCount), Name));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" LLVMValueRef LLVMRustBuildCatchRet(LLVMBuilderRef B,
|
|
||||||
LLVMValueRef Pad,
|
|
||||||
LLVMBasicBlockRef BB) {
|
|
||||||
return wrap(unwrap(B)->CreateCatchRet(cast<CatchPadInst>(unwrap(Pad)),
|
|
||||||
unwrap(BB)));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" LLVMValueRef LLVMRustBuildCatchSwitch(LLVMBuilderRef B,
|
|
||||||
LLVMValueRef ParentPad,
|
|
||||||
LLVMBasicBlockRef BB,
|
|
||||||
unsigned NumHandlers,
|
|
||||||
const char *Name) {
|
|
||||||
if (ParentPad == nullptr) {
|
|
||||||
Type *Ty = Type::getTokenTy(unwrap(B)->getContext());
|
|
||||||
ParentPad = wrap(Constant::getNullValue(Ty));
|
|
||||||
}
|
|
||||||
return wrap(unwrap(B)->CreateCatchSwitch(unwrap(ParentPad), unwrap(BB),
|
|
||||||
NumHandlers, Name));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void LLVMRustAddHandler(LLVMValueRef CatchSwitchRef,
|
|
||||||
LLVMBasicBlockRef Handler) {
|
|
||||||
Value *CatchSwitch = unwrap(CatchSwitchRef);
|
|
||||||
cast<CatchSwitchInst>(CatchSwitch)->addHandler(unwrap(Handler));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" OperandBundleDef *LLVMRustBuildOperandBundleDef(const char *Name,
|
extern "C" OperandBundleDef *LLVMRustBuildOperandBundleDef(const char *Name,
|
||||||
LLVMValueRef *Inputs,
|
LLVMValueRef *Inputs,
|
||||||
unsigned NumInputs) {
|
unsigned NumInputs) {
|
||||||
@ -1627,6 +1561,7 @@ extern "C" void LLVMRustSetLinkage(LLVMValueRef V,
|
|||||||
LLVMSetLinkage(V, fromRust(RustLinkage));
|
LLVMSetLinkage(V, fromRust(RustLinkage));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: replace with LLVMConstInBoundsGEP2 when bumped minimal version to llvm-14
|
||||||
extern "C" LLVMValueRef LLVMRustConstInBoundsGEP2(LLVMTypeRef Ty,
|
extern "C" LLVMValueRef LLVMRustConstInBoundsGEP2(LLVMTypeRef Ty,
|
||||||
LLVMValueRef ConstantVal,
|
LLVMValueRef ConstantVal,
|
||||||
LLVMValueRef *ConstantIndices,
|
LLVMValueRef *ConstantIndices,
|
||||||
@ -1704,12 +1639,6 @@ extern "C" LLVMRustVisibility LLVMRustGetVisibility(LLVMValueRef V) {
|
|||||||
return toRust(LLVMGetVisibility(V));
|
return toRust(LLVMGetVisibility(V));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Oh hey, a binding that makes sense for once? (because LLVM’s own do not)
|
|
||||||
extern "C" LLVMValueRef LLVMRustBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val,
|
|
||||||
LLVMTypeRef DestTy, bool isSigned) {
|
|
||||||
return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy), isSigned, ""));
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" void LLVMRustSetVisibility(LLVMValueRef V,
|
extern "C" void LLVMRustSetVisibility(LLVMValueRef V,
|
||||||
LLVMRustVisibility RustVisibility) {
|
LLVMRustVisibility RustVisibility) {
|
||||||
LLVMSetVisibility(V, fromRust(RustVisibility));
|
LLVMSetVisibility(V, fromRust(RustVisibility));
|
||||||
|
Loading…
Reference in New Issue
Block a user