Я изменяю rust/compiler/rustc_codegen_llvm/src/builder.rs , чтобы добавить вызовы внешней функции с помощью ARG в форме LLVM IR.
Объявление функции является extern "c" void __my_func (int num) {...} . и я пытаюсь вызвать его с помощью следующих кодов.
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>
С помощью этого кода он может компилировать Rustc, но неисправность сегментации происходит, если я использую Stage1 Rustc для составления других программ Rust следующим образом. < /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>
Похоже, что что -то не так с адресами, но я не уверен. Кто -нибудь может дать мне какие -нибудь советы?
Подробнее здесь: https://stackoverflow.com/questions/794 ... in-llvm-ir
Как вызвать внешнюю функцию с Args в LLVM IR? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1738487731
Anonymous
Я изменяю rust/compiler/rustc_codegen_llvm/src/builder.rs , чтобы добавить вызовы внешней функции с помощью ARG в форме LLVM IR.
Объявление функции является extern "c" void __my_func (int num) {...} . и я пытаюсь вызвать его с помощью следующих кодов.
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>
С помощью этого кода он может компилировать Rustc, но неисправность сегментации происходит, если я использую Stage1 Rustc для составления других программ Rust следующим образом. < /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>
Похоже, что что -то не так с адресами, но я не уверен. Кто -нибудь может дать мне какие -нибудь советы?
Подробнее здесь: [url]https://stackoverflow.com/questions/79406314/how-to-call-an-external-function-with-args-in-llvm-ir[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия