How to get the arguments of a function call in LLVM?

I want to write an LLVM pass that’ll extract the arguments of function calls. If the argument is a constant one, my objective is to recover what that constant is.

The IR looks like

%2 = call noalias i8* @malloc(i64 512) #3

The LLVM pass looks like

bool runOnFunction(Function &F) override {
for (auto& B : F) {
for (auto& I : B) {
if(CallInst* call_inst = dyn_cast(&I)) {
Function* fn = call_inst->getCalledFunction();
StringRef fn_name = fn->getName();
errs() << fn_name << " : " << call_inst->getArgOperand(0) << “\n”;
for(auto arg = fn->arg_begin(); arg != fn->arg_end(); ++arg) {
errs() << *arg << “\n”;
}
}
}
}

return false;
}

If I run the pass through opt, it produces the following

malloc : 0x3df3f40
i64 %0

What does 0x3df3f40 represent? Instead of 164 and 512, why does it produce i64 and %0?

If I run the pass through `opt`, it produces the following

    malloc : 0x3df3f40
    i64 %0

What does `0x3df3f40` represent?

getArgOperand returns a pointer to a Value object. You're printing
that pointer directly rather than calling its print method to get a
sensible representation.

Instead of `164` and `512`, why does it produce `i64` and `%0`?

That's because you're iterating through the argument as it exists at
the function's definition/declaration rather than the callsite. You
should be using the CallInst's accessors rather than the Function's if
you want the arguments used for this particular call.

Cheers.

Tim.