2016-02-12 2 views
1

УчитываяЧто вызывает CallInst :: Create() в LLVM?

static CallInst *Create(Value *Func, 
         ArrayRef<Value *> Args, 
         const Twine &NameStr = "", 
         Instruction *InsertBefore = 0) 

эту функцию, интересно каково значение возврата этой функции средства.

Например, в следующем коде,

int foo(int a); 
... 
Function *foo_ptr = ~~;//say, foo is refered through getOrInsertFunction() 
CallInst *ptr = CallInst::Create(foo_ptr, .../* properly set */); 

CallInst * PTR это возвращаемое значение. Соответствует ли ptr

  1. целочисленное значение, возвращаемое int foo (int);
  2. или ВЫЗОВ инструкция

Я думал, что номер 2 был ответ, но начал путаться, глядя на некоторые коды.

ответ

1

И 1, и 2 являются «истинными». Он возвращает команду вызова, чье «значение», когда мы выполняем код, будет возвратным значением функции.

Для иллюстрации, возьмите эту маленькую Паскаль программу:

program p; 

function f: integer; 
begin 
    f := 42; 
end; { f } 

begin 
    writeln(f); 
end. 

который переводит к этому LLVM-IR:

; ModuleID = 'TheModule' 
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 
target triple = "x86_64-unknown-linux-gnu" 

%text = type { i32, i8*, i32, i32 } 

@input = global %text zeroinitializer, align 8 
@output = global %text zeroinitializer, align 8 
@UnitIniList = constant [1 x i8*] zeroinitializer 

define i32 @P.f() #0 { 
entry: 
    %f = alloca i32, align 4 
    store i32 42, i32* %f 
    %0 = load i32, i32* %f 
    ret i32 %0 
} 

define void @__PascalMain() #0 { 
entry: 
    %calltmp = call i32 @P.f() 
    call void @__write_int(%text* @output, i32 %calltmp, i32 0) 
    call void @__write_nl(%text* @output) 
    ret void 
} 

declare void @__write_int(%text*, i32, i32) 

declare void @__write_nl(%text*) 

attributes #0 = { "no-frame-pointer-elim"="true" } 

call i32 @P.f() порождается:

inst = builder.CreateCall(calleF, argsV, "calltmp"); 

содержимое inst - %calltmp = call i32 @P.f() - и это CallInst «Значение».

и inst возвращается к оценке выражения для аргумента writeln.