Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在符合LLVM IR中的C调用约定的情况下按值传递结构 我想在C++和JIT LVVM程序之间传递值结构。我已经看到了很多关于这方面的讨论,甚至还有一些关于这方面的问题。我已经读到,如果我想让我的程序真正通过值传递,我需要做一些叫做“参数强制”的事情。使用byval和sret看起来是一种简单的跨平台解决方案。它仍然有点痛苦,C++代码必须记住传递指针而不是值(虽然调用代码是C++的,所以我可以做一些模板魔术)。_C++_Llvm Ir_Llvm C++ Api - Fatal编程技术网

在符合LLVM IR中的C调用约定的情况下按值传递结构 我想在C++和JIT LVVM程序之间传递值结构。我已经看到了很多关于这方面的讨论,甚至还有一些关于这方面的问题。我已经读到,如果我想让我的程序真正通过值传递,我需要做一些叫做“参数强制”的事情。使用byval和sret看起来是一种简单的跨平台解决方案。它仍然有点痛苦,C++代码必须记住传递指针而不是值(虽然调用代码是C++的,所以我可以做一些模板魔术)。

在符合LLVM IR中的C调用约定的情况下按值传递结构 我想在C++和JIT LVVM程序之间传递值结构。我已经看到了很多关于这方面的讨论,甚至还有一些关于这方面的问题。我已经读到,如果我想让我的程序真正通过值传递,我需要做一些叫做“参数强制”的事情。使用byval和sret看起来是一种简单的跨平台解决方案。它仍然有点痛苦,C++代码必须记住传递指针而不是值(虽然调用代码是C++的,所以我可以做一些模板魔术)。,c++,llvm-ir,llvm-c++-api,C++,Llvm Ir,Llvm C++ Api,我对这个问题读得越多,我似乎越不理解它。调用约定是一个特定于平台的问题,应该由代码生成器处理,对吗?我不明白为什么特定于平台的代码生成器不只是处理特定于平台的结构处理方式(同时符合平台的C ABI)。前端应该是平台无关的 有没有一个通行证可以为我做强制辩论?访问每个函数声明和每个函数调用并转换所有结构以使其与平台的C ABI兼容的过程?我觉得如果它存在的话,所有前端都会使用它,而Clang不使用它,所以这可能是不可能的。为什么这不是一个可行的解决方案?如果通行证可以处理这个问题,那么我希望它是L

我对这个问题读得越多,我似乎越不理解它。调用约定是一个特定于平台的问题,应该由代码生成器处理,对吗?我不明白为什么特定于平台的代码生成器不只是处理特定于平台的结构处理方式(同时符合平台的C ABI)。前端应该是平台无关的

有没有一个通行证可以为我做强制辩论?访问每个函数声明和每个函数调用并转换所有结构以使其与平台的C ABI兼容的过程?我觉得如果它存在的话,所有前端都会使用它,而Clang不使用它,所以这可能是不可能的。为什么这不是一个可行的解决方案?如果通行证可以处理这个问题,那么我希望它是LLVM的一部分

我不明白为什么每一个前端都要做论点强制。我甚至不知道如何进行辩论强制。我见过一些例子,人们使用铿锵代码生成代码,并分解出执行参数强制的部分。不幸的是,如果我想要真正的C ABI兼容性,这似乎是最好的解决方案。甚至可以将另一个前端的一部分重新用于另一种完全不同的语言,这一事实让我继续想,为什么必须在前端中完成这项工作

对此必须采取措施!我们不能在每个前端都编写相同的C ABI兼容代码。太可笑了!也许我就是不明白


有人能帮我澄清一下吗?我正在考虑使用
byval
sret
,因为这比修改铿锵代码生成器更简单。有更简单的方法吗?

在LLVM IR中按值传递结构时,必须制定自己的规则。我选择了一套最简单的规则

假设我有一个这样的程序:

struct MyStruct {
  int a;
  char b, c, d, e;
};

MyStruct identityImpl(MyStruct s) {
  return s;
}

MyStruct identity(MyStruct s) {
  return identityImpl(s);
}
此程序的LLVM IR等效于:

void identityImpl(MyStruct *ret, const MyStruct *s) {
  MyStruct localS = *s;
  *ret = localS;
}

void identity(MyStruct *ret, const MyStruct *s) {
  MyStruct localS = *s;
  MyStruct localRet;
  identityImpl(&localRet, &localS);
  *ret = localRet;
}
这不是传递结构的最有效方式,因为
MyStruct
可以放入64位寄存器。但是,如果优化器可以证明
局部变量
从未写入,那么它可以删除
局部变量
,并直接使用
s
。这两个函数都优化为对
memcpy
的单个调用


这只花了半天时间。走这条叮当作响的路线可能至少需要一个星期。我仍然认为我不得不这么做是很不幸的,但我现在明白了问题所在。结构的传递不是由平台的C ABI指定的。

“调用约定是一个特定于平台的问题,应该由代码生成器处理,对吗?”-错误。平台调用约定通常只包含简单参数,而未指定复杂类型的传递。这有点糟糕,但事实就是这样。原因是有时会有特定语言的规则影响这一点。例如,C++可以通过拆分它们来传递简单结构,但是复制复制器的结构不允许这样做。这甚至适用于C;按值传递结构不是ABI的可靠部分。@SebastianRedl这确实是unfortunate@Kerndog73不,你只需要处理它并提出一个新问题。塞巴斯蒂安给了你一些工具。@TedLyngmo我正在改变我的通话习惯。当结构在源语言中按值传递时,它们在IR中按指针传递,并在被调用方中生成本地副本。返回结构时,调用者将传递一个额外的指针参数,供被调用者填充。这意味着我不能从C++中自然地调用JIT函数,但我并不介意。