Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从ExecutionEngine调用C/C++函数

从ExecutionEngine调用C/C++函数
EN

Stack Overflow用户
提问于 2013-07-11 03:52:21
回答 2查看 3K关注 0票数 11

我正在学习llvm,并想对我的想法做一个概念证明。

基本上,我想把我的编译器和运行时分开。编译器将提供一个.bc,运行时将通过ParseBitcodeFile加载它,并使用ExecutionEngine来运行它。这部分起作用了。

现在,为了更容易地进行系统调用,我希望能够在我的运行时实现C/C++函数,这些函数执行所有的系统调用(文件io、标准输出打印等)。我的问题是,我如何从我的玩具编译器的代码中调用这些函数,并允许它在执行时使用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-11 04:35:21

好消息是:当使用JIT ExecutionEngine时,这将会正常工作。当JIT-er找到IR使用的外部符号,而该外部符号在IR本身中找不到时,它会查找JIT进程本身,因此可以调用主机程序中可见的任何符号。

这在part 4 of the LLVM tutorial中有直接的解释

哇,JIT怎么知道原罪和cos的?答案非常简单:在本例中,JIT开始执行函数并调用函数。它意识到该函数尚未被JIT编译并调用标准例程集来解析该函数。在本例中,没有为函数定义主体,因此JIT最终在万花筒进程本身上调用“dlsym(”sin“)”。因为“sin”是在JIT的地址空间中定义的,所以它只是修补模块中的调用,以便直接调用sin的libm版本。

关于血淋淋的细节,请看lib/ExecutionEngine/JIT/JIT.cpp --特别是它对DynamicLibrary的使用。

票数 12
EN

Stack Overflow用户

发布于 2013-07-11 06:37:01

Eli的回答很棒,你应该接受它。不过,还有另一种选择,那就是将运行时的源文件单独编译为LLVM模块(例如,使用Clang),然后使用ExecutionEngine::addModule()添加它们。

它不太方便,而且它意味着编译相同的文件两次(一次用于您的主机程序,另一次用于从主机程序获取Module),但好处是它支持从JITted代码进行内联和其他跨函数优化。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17584752

复制
相关文章
C++调用C函数
前言:以前见到extern "C"这样的语句,只是简单地知道跟外部链接有关,但是没有深刻理解它的意思。 首先,为什么要使用extern "C"修饰符? C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。调用C语言的函数,需要在函数声明的地方语句extern "C"。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。 Test.obj : error LNK2019: 无法解析的外部符号 "void __cdecl DeleteStack(struct _No
程序员互动联盟
2018/03/16
2.9K0
C++调用C函数
今天遇到的问题; 自己定义a.h文件 里面有一个方法 c实现的方法 然后有定义了一个b.h b.cpp文件 我引入了a.h 在b.cpp文件使用 c的方法 搞了半天都编译通过 原因: 因为C++源文件已经引入了C的头文件, 在头文件里,声明该函数时没有extern修饰 解决办法: 验证: aa.cpp: extern "C" { #include "a.h" } #include "aa.h" #include "stdio.h" int AA::bar(int a, int b){
程序员小王
2018/04/13
2.2K0
C代码调用C++函数
编译为动态链接库 g++ -fPIC -shared -o libhello.so hello.cpp
十毛
2019/03/27
2.2K0
C++级联函数调用
要实现这样的调用,就必须在类的成员函数之中,返回一个*this指针,这也是实现级联函数调用的关键。
灯珑LoGin
2022/10/31
8750
C++ 定义和调用函数
无参函数定义的一般形式为:     类型标识符 函数名([void])     {         声明部分         语句     } 有参函数定义的一般形式为:     类型标识符 函数名(形式参数表列)     {         声明部分         语句
AIHGF
2019/02/18
8410
C++ 函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归(recursive)调用。包含递归调用的函数称为递归函数。 比如:
chaibubble
2022/05/07
1.2K0
C++ 函数的递归调用
c++函数调用,函数编写(写自己的函数)以及数组调用,传递
在matlab里.m文件分执行文件和函数文件 在c++中执行文件指:main函数 函数文件:其他所有需要用到的函数
用户7886150
2021/02/03
2.3K0
C++内部函数与外部函数 | 调用外部Max函数
内部函数是指一个函数只能被本文件中其他函数所调用,在定义内部函数时,在函数名和函数类型的前面加static。
小林C语言
2020/12/01
2.4K0
C++内部函数与外部函数 | 调用外部Max函数
C++函数调用 | 对被调函数做声明
在C++中,不允许对函数做嵌套定义,也就是说在一个函数中不能完整地包含另一个函数,在一个程序中每个函数的定义都是互相平行和独立的。
小林C语言
2020/11/30
1.5K0
C++函数调用 | 对被调函数做声明
c++之普通函数和模板函数的调用规则
1.如果模板函数和普通函数都可以实现,则优先调用普通函数。 2.可以通过空模板参数列表来强制调用模板函数; 3.函数模板也可以重载; 4.如果函数模板可以产生更好的匹配,优先调用函数模板; #include<iostream> using namespace std; int myAdd(int a, int b) { cout << "调用普通函数" << endl; return a + b; } template<class T> T myAdd(T a, T b) { co
西西嘛呦
2020/08/26
8800
C#调用C++动态库接口函数和回调函数
需求: 当前C++已经写好了一个动态库,完成了产品开发需求,C#需要调用C++编写的动态库DLL接口,开发出完整的软件,DLL动态库里包含了普通接口函数,回调函数。
DS小龙哥
2022/05/23
2.8K0
C#调用C++动态库接口函数和回调函数
实战C++对象模型之成员函数调用
先说结论:C++的类成员函数和C函数实质是一样的,只是C++类成员函数多了隐藏参数this。
一见
2019/03/20
1K0
C++函数调用过程深入分析
函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场、回复现场等又是怎样实现的呢?本文将对函数调用的过程进行深入的分析和详细解释,并在VC 6.0环境下进行演示。分析不到位或者存在错误的地方请批评指正,请与作者联系。
C语言与CPP编程
2021/04/16
2.5K0
c++之函数调用运算符重载
函数调用运用()也可以重载。 由于重载后的使用方法非常像函数的调用,因此称为仿函数。 仿函数没有固定写法,非常灵活。 #include<iostream> using namespace std; class MyPrint { public: void operator()(string test) { cout << test << endl; } }; class MyAdd { public: int operator()(int num1, int num
西西嘛呦
2020/08/26
3850
C++如何禁止函数的传值调用
按照参数形式的不同,C++应该有三种函数调用方式:传值调用、引用调用和指针调用。对于基本数据类型的变量作为实参进行参数传递时,采用传值调用与引用调用和指针调用的效率相差不大。但是,对于类类型来说,传值调用和引用调用之间的区别很大,类对象的尺寸越大,这种差别越大。
恋喵大鲤鱼
2019/02/22
2.4K0
C++调用C接口
目录 C++调用C代码 解决调用失败问题 思考:那C代码能够被C程序调用吗 C代码既能被C++调用又能被C调用 C++调用C代码 一个C语言文件p.c #include <stdio.h> void print(int a,int b) { printf("这里调用的是C语言的函数:%d,%d\n",a,b); } 一个头文件p.h #ifndef _P_H #define _P_H void print(int a,int b); #endif C++文件调用C函数 #incl
huofo
2022/03/18
1.8K0
C++调用C接口
java调用c++函数的简单笔记
java使用jni调用c++动态库函数. 步骤: 1.编写java测试代码如下: 1 public class CallNativeDemo { 2 native void func(); 3 4 native double add(double a, double b); 5 6 public static void main(String[] args) { 7 System.loadLibrary("Main"); 8 Cal
Gxjun
2018/03/27
1.7K0
C++调用Python
Python作为一门流行通用的脚本语言,可以很好的和C/C++程序结合在一起。 在一个C/C++应用程序中,我们可以用一组插件来实现一些具有统一接口的功能,一般插件都是使用动态链接库实现,如果插件的变化比较频繁,我们可以使用Python来代替动态链接库形式的插件,这样可以很方便地更具需要求的变化改写脚本代码(进行不同的数据处理),而不是必须重新编译链接二进制的动态链接库。
chain
2018/08/02
9.6K0
【面试宝典】c调用c++函数,为什么要加extern c
首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数 extern "C"是连接申明(link
程序员互动联盟
2018/03/16
1.9K0
C语言中调用C++
因项目中需要更新VAD算法,VAD使用C++实现的. 代码框架中需要使用C调用C++来实现对VAD的调用. C++调用C很方便, 如果C调用C++,主要思想是将C++的动态库封装一层,这一层采用C语言实现,主要封装C++中的类 示例 test_class.h #ifndef TESTCLASS_H #define TESTCLASS_H #include<iostream> #include<stdio.h> class ValueClass { private: int value;
程序手艺人
2018/05/18
9.2K0

相似问题

从c调用c++函数

32

从C++调用C++成员函数

10

从FORTRAN代码调用的C++函数调用C++函数

12

从C#调用C++函数

20

从C#调用C++函数

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文