Ich modifiziere den Rost/Compiler/sastc_codegen_llvm/src/builder.rs , um externe Funktionsaufrufe mit Argums in LLVM IR -Form hinzuzufügen.
Die Funktionserklärung ist externe "c" void __my_func (int num) {...} .und ich versuche es mit folgenden Codes aufzurufen.
fn call_external_func(&mut self, num: usize) {
let args_ty = [self.cx.isize_ty];
let ret_ty = self.cx.type_void();
let fn_name = "__my_func";
let num_const =
unsafe { llvm::LLVMConstInt(self.cx.isize_ty, num as u64, False) };
let args = [num_const];
let fn_type = self.cx.type_func(&args_ty, ret_ty);
let external_func = unsafe {
llvm::LLVMRustGetOrInsertFunction(
self.cx.llmod,
fn_name.as_ptr().cast(),
fn_name.len(),
fn_type,
)
};
let call = unsafe {
llvm::LLVMBuildCallWithOperandBundles(
self.llbuilder,
fn_type,
external_func,
args.as_ptr() as *const &llvm::Value,
1 as c_uint, // Only one argument
[].as_ptr(), // Operand bundles pointer (empty in this case)
0, // Number of bundles
"".as_ptr().cast(), // Name of the call
)
};
unsafe {
llvm::LLVMSetLinkage(call, llvm::ExternalLinkage);
}
}
< /code>
Mit diesem Code ist es in der Lage, RustC zu kompilieren, aber der Segmentierungsfehler, wenn ich Stufe1 RustC verwende, um andere Rust -Programme wie folgt zu kompilieren. < /p>
// command like /home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/rustc --emit=mir -o after.mir test.rs
error: rustc interrupted by SIGSEGV, printing backtrace
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xcf9aa6)[0x7efe66c8daa6]
/lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7efe65da6520]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x353846f)[0x7efe694cc46f]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x110ea75)[0x7efe670a2a75]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x101c9ce)[0x7efe66fb09ce]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x10e77ea)[0x7efe6707b7ea]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x1089883)[0x7efe6701d883]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x1088ec9)[0x7efe6701cec9]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x101bf3e)[0x7efe66faff3e]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(_RNvXs5_Cs19lfpqY5KDg_18rustc_codegen_llvmNtB5_18LlvmCodegenBackendNtNtNtCshnGYRhF9bb0_17rustc_codegen_ssa6traits7backend14CodegenBackend13codegen_crate+0xfd)[0x7efe66fe29cd]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xfcf69d)[0x7efe66f6369d]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(_RNvMNtCsb2DN1jkzvVd_15rustc_interface7queriesNtB2_6Linker24codegen_and_build_linker+0x7b8)[0x7efe66edc0c8]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xd431ce)[0x7efe66cd71ce]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xcc596d)[0x7efe66c5996d]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xd6eeb9)[0x7efe66d02eb9]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xd6df63)[0x7efe66d01f63]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xd17c80)[0x7efe66cabc80]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xd0ebf2)[0x7efe66ca2bf2]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xd1bb20)[0x7efe66cafb20]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(_RINvNtNtCs80Q9hQy23cT_3std3sys9backtrace28___rust_begin_short_backtraceNCNCINvNtCsb2DN1jkzvVd_15rustc_interface4util26run_in_thread_with_globalsNCINvB1e_31run_in_thread_pool_with_globalsNCINvNtB1g_9interface12run_compileruNCNvCscL3LCxAwsNl_17rustc_driver_impl12run_compiler0Es_0uE0uE00uEB3C_+0x62)[0x7efe66ca9d12]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0xd18ec3)[0x7efe66cacec3]
/home/monsoon/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-b5f6124ddf75af00.so(+0x7bdb0fb)[0x7efe6db6f0fb]
/lib/x86_64-linux-gnu/libc.so.6(+0x94ac3)[0x7efe65df8ac3]
/lib/x86_64-linux-gnu/libc.so.6(+0x126850)[0x7efe65e8a850]
note: we would appreciate a report at https://github.com/rust-lang/rust
help: you can increase rustc's stack size by setting RUST_MIN_STACK=16777216
note: backtrace dumped due to SIGSEGV! resuming signal
Segmentation fault (core dumped)
< /code>
Es sieht so aus, als ob mit Adressen etwas nicht stimmt, aber ich bin mir nicht sicher. Kann mir jemand einen Rat anbieten?
Wie nenne ich eine externe Funktion mit Args in LLVM IR? ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post