我正在学习LLVM.据我所知,在LLVM中提供的许多有用的C函数已经作为内在函数.所以我试图从我的代码中调用@printf函数.
我在LLVM参考手册中找到了描述IR代码的相应部分,这是相对清楚的:
declare i32 @printf(i8* noalias nocapture, ...)
call i32 (i8*, ...)* @printf(i8* %msg, i32 12, i8 42)
Run Code Online (Sandbox Code Playgroud)
但是我无法使用IRBuilder <>类找到如何做到这一点.我检查了构建器类,但我无法弄清楚任何事情.
我不想传递任何花哨的变量,基本上只是像
printf( "%lu", variable_64_bit );
Run Code Online (Sandbox Code Playgroud)
在C或类似的东西.
任何人都可以告诉我通过构建器调用printf函数必须做些什么.
提前致谢
LLVM项目不区分此处描述的有符号和无符号整数.在某些情况下,您需要知道特定变量是应该被解释为有符号还是无符号变量,例如,当它是大小扩展时或在分区中使用时.我的解决方案是为每个变量保留一个单独的类型信息,描述它是整数还是基数类型.
但是,我想知道,是不是有办法在LLVM中"归属"这种类型?我正在寻找可以添加到某种类型的某种"用户数据",但似乎什么都没有.在创建类型时必须以某种方式发生这种情况,因为在LLVM中只生成一次相同的类型.
因此,我的问题是:
有没有办法跟踪整数变量是否应该在LLVM基础结构中被解释为有符号或无符号,或者确实是像我一样保留单独信息的唯一方法?
谢谢
我试图理解与Adacore Libre版本一起提供的Gnat编译器与在Linux发行版或MinGw中使用gcc标准的编译器之间的根本区别.
我假设主要的区别可能是Adacore版本总是最新版本,而Linux版本的版本可能是在分发版本发布之日可用的版本.
但是还有功能上的差异吗?意味着Adacore版本中是否有任何改进的功能,他们不会发布到Gnu提供的一般开源版本?
我不是一个非常有经验的Linux用户,所以如果在Gnu /开源世界中有更多经验这是透明的,那么道歉,但我找不到任何关于此的内容.
我是一个相当新的Ada程序员.我读过Barnes的书(我可能会补充两次)甚至设法在Ada写一个公平的终端程序.我的主要语言是C++.
我目前想知道是否有办法在Ada中"保护"子程序调用,也许在Ada 2012中(我基本上什么都不知道).让我解释一下我的意思(尽管用C++术语).
假设你有一个Secret这样的类:
class Secret
{
private:
int secret_int;
public:
Set_Secret_Value( int i );
}
Run Code Online (Sandbox Code Playgroud)
现在这是常见的东西,不要暴露secret_int,只能通过访问函数来操纵它.但是,问题是任何有权访问Secret类型对象的人都可以操纵该值,无论该特定代码段是否应该这样做.因此,恶意改变secret_int的危险已经减少到任何人通过允许的函数改变secret_int,即使它发生在不应该操纵它的代码部分.
为了解决这个问题,我想出了以下结构
class Secret
{
friend class Secret_Interface;
private:
int secret_int;
Set_Secret_Value( int i );
Super_Secret_Function();
};
class Secret_Interface
{
friend class Client;
private:
static Set_Secret_Value( Secret &rc_secret_object, int i )
{
rc_secret_object.Set_Secret( i );
}
};
class Client
{
Some_Function()
{
...
Secret_Interface::Set_Secret_Value( c_object, some-value );
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在,类Secret_Interface可以确定哪些其他类可以使用它的私有函数,并通过这样做间接地实现暴露给类Secret的函数Secret_Interface.这样,类Secret仍然具有私有函数,这些函数不能被类外的任何人调用,例如函数Super_Secret_Function().
好吧,我想知道在Ada中是否有任何类型的东西是可能的.基本上我的愿望是能够说:
Code A may only …Run Code Online (Sandbox Code Playgroud) 我正在学习 LLVM 基础知识。我正在尝试进入构建器框架并设置模块、函数头等,但我还无法找到在构建器中创建这样的简单序列的方法:
%0 = 41
%1 = add i32 42, %0
Run Code Online (Sandbox Code Playgroud)
这意味着我如何通过构建器框架使用伪寄存器表示法?
我尝试根据两个常量创建一条加指令。我用来生成(整数)加法的核心行是:
Value *L = (Value *)m_left->Create_LLVM( );
Value *R = (Value *)m_right->Create_LLVM();
if ( L == 0 || R == 0 ) return 0;
llvm::Value *p_instruction = Get_Builder().CreateAdd( L, R, "addtmp" );
Run Code Online (Sandbox Code Playgroud)
这包含很多我自己的功能,但我想基础知识很清楚。我获得左操作数和右操作数的值指针,它们都是常量,然后使用构建器框架创建添加操作。模块和构建器再次正确设置,当我调用 dump() 时,我看到我所做的所有其他内容,但上面的这一行不会创建任何 IR 代码。
我希望它能共同创造类似的东西
%4 = add i32 %3, %2
Run Code Online (Sandbox Code Playgroud)
或类似的东西。我是否误解了与构建器一起构建操作的基本方式,或者只是对某些细节的一些小疏忽?
谢谢