用LLVM参数传递结构(Pass structure by parameter with LLVM)

2019-09-23 14:35发布

是否有可能通过参数来传递结构?

它是用C ABI兼容?

[编辑]

基本上,我想有一个C ++ POD其中将包括两个构件(结构将是一个脂肪指针,用指针和一个整数),以及能够通过这样的结构,在呼叫指令功能参数(即使调用C时码)。

我现在不使用脂肪指针(指针和整数是每一个不同的函数参数),我想知道,如果它开始一个相当大的重构之前有可能!

Answer 1:

当然,你可以。 下面是一个例子:

struct MyStruct_t {
    char *charPointer;
    int number;
};

void myFunction(MyStruct_t myStructAsParam) {

    printf("String: %s, Number: %i", myStructAsParam.charPointer, myStructAsParam.number);
    // Your stuff here.
}


Answer 2:

你可以这样做。

你可以找出LLVM代码是什么样品C通过复制和粘贴在C代码为LLVM的在线演示http://llvm.org/demo/index.cgi 。

如果您复制并在codepad.org在粘贴代码,你会发现LLVM生成myFunction的以下内容:

define void @_Z10myFunction10MyStruct_t(i8* %myStructAsParam.coerce0, i32     %myStructAsParam.coerce1) nounwind uwtable {
  %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([23 x i8]* @.str, i64 0, i64 0), i8* %myStructAsParam.coerce0, i32 %myStructAsParam.coerce1)
  ret void
}

当然,如果你看一下呼叫你会发现,没有副本正在取得进展。 它是由调用函数来做到这一点。 如果我们写一个小C函数:

void myCallingFunction(MyStruct_t *foobar)
{
  myFunction(*foobar);
}

我们可以看到,所产生的LLVM位码为myCallingFunction是:

define void @_Z17myCallingFunctionP10MyStruct_t(%struct.MyStruct_t* nocapture %foobar)   nounwind uwtable {
  %foobar.0 = getelementptr inbounds %struct.MyStruct_t* %foobar, i64 0, i32 0
  %tmp = load i8** %foobar.0, align 8
  %foobar.1 = getelementptr inbounds %struct.MyStruct_t* %foobar, i64 0, i32 1
  %tmp1 = load i32* %foobar.1, align 8
  %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([23 x i8]* @.str, i64 0, i64 0), i8* %tmp, i32 %tmp1) nounwind
  ret void
}

调用函数,使结构的副本,然后通过在副本中的地址。



文章来源: Pass structure by parameter with LLVM
标签: c llvm