66//
77// ===----------------------------------------------------------------------===//
88
9- #include " llvm/AsmParser/Parser.h"
109#include " llvm/IR/AbstractCallSite.h"
10+ #include " llvm/AsmParser/Parser.h"
11+ #include " llvm/IR/Argument.h"
1112#include " llvm/IR/Function.h"
1213#include " llvm/IR/Module.h"
1314#include " llvm/Support/SourceMgr.h"
@@ -51,15 +52,27 @@ TEST(AbstractCallSite, CallbackCall) {
5152 EXPECT_TRUE (ACS);
5253 EXPECT_TRUE (ACS.isCallbackCall ());
5354 EXPECT_TRUE (ACS.isCallee (CallbackUse));
55+ EXPECT_EQ (ACS.getCalleeUseForCallback (), *CallbackUse);
5456 EXPECT_EQ (ACS.getCalledFunction (), Callback);
57+
58+ // The callback metadata {CallbackNo, Arg0No, ..., isVarArg} = {1, -1, true}
59+ EXPECT_EQ (ACS.getCallArgOperandNoForCallee (), 1 );
60+ // Though the callback metadata only specifies ONE unfixed argument No, the
61+ // callback callee is vararg, hence the third arg is also considered as
62+ // another arg for the callback.
63+ EXPECT_EQ (ACS.getNumArgOperands (), 2 );
64+ Argument *Param0 = Callback->getArg (0 ), *Param1 = Callback->getArg (1 );
65+ ASSERT_TRUE (Param0 && Param1);
66+ EXPECT_EQ (ACS.getCallArgOperandNo (*Param0), -1 );
67+ EXPECT_EQ (ACS.getCallArgOperandNo (*Param1), 2 );
5568}
5669
5770TEST (AbstractCallSite, DirectCall) {
5871 LLVMContext C;
5972
60- const char *IR = " declare void @bar()\n "
73+ const char *IR = " declare void @bar(i32 %x, i32 %y )\n "
6174 " define void @foo() {\n "
62- " call void @bar()\n "
75+ " call void @bar(i32 1, i32 2 )\n "
6376 " ret void\n "
6477 " }\n " ;
6578
@@ -77,13 +90,30 @@ TEST(AbstractCallSite, DirectCall) {
7790 EXPECT_TRUE (ACS.isDirectCall ());
7891 EXPECT_TRUE (ACS.isCallee (DirectCallUse));
7992 EXPECT_EQ (ACS.getCalledFunction (), Callee);
93+ EXPECT_EQ (ACS.getNumArgOperands (), 2 );
94+ Argument *ArgX = Callee->getArg (0 );
95+ ASSERT_NE (ArgX, nullptr );
96+ Value *CAO1 = ACS.getCallArgOperand (*ArgX);
97+ Value *CAO2 = ACS.getCallArgOperand (0 );
98+ ASSERT_NE (CAO2, nullptr );
99+ // The two call arg operands should be the same object, since they are both
100+ // the first argument of the call.
101+ EXPECT_EQ (CAO2, CAO1);
102+
103+ ConstantInt *FirstArgInt = dyn_cast<ConstantInt>(CAO2);
104+ ASSERT_NE (FirstArgInt, nullptr );
105+ EXPECT_EQ (FirstArgInt->getZExtValue (), 1 );
106+
107+ EXPECT_EQ (ACS.getCallArgOperandNo (*ArgX), 0 );
108+ EXPECT_EQ (ACS.getCallArgOperandNo (0 ), 0 );
109+ EXPECT_EQ (ACS.getCallArgOperandNo (1 ), 1 );
80110}
81111
82112TEST (AbstractCallSite, IndirectCall) {
83113 LLVMContext C;
84114
85115 const char *IR = " define void @foo(ptr %0) {\n "
86- " call void %0()\n "
116+ " call void %0(i32 1, i32 2 )\n "
87117 " ret void\n "
88118 " }\n " ;
89119
@@ -105,4 +135,13 @@ TEST(AbstractCallSite, IndirectCall) {
105135 EXPECT_TRUE (ACS.isCallee (IndCallUse));
106136 EXPECT_EQ (ACS.getCalledFunction (), nullptr );
107137 EXPECT_EQ (ACS.getCalledOperand (), ArgAsCallee);
138+ EXPECT_EQ (ACS.getNumArgOperands (), 2 );
139+ Value *CalledOperand = ACS.getCallArgOperand (0 );
140+ ASSERT_NE (CalledOperand, nullptr );
141+ ConstantInt *FirstArgInt = dyn_cast<ConstantInt>(CalledOperand);
142+ ASSERT_NE (FirstArgInt, nullptr );
143+ EXPECT_EQ (FirstArgInt->getZExtValue (), 1 );
144+
145+ EXPECT_EQ (ACS.getCallArgOperandNo (0 ), 0 );
146+ EXPECT_EQ (ACS.getCallArgOperandNo (1 ), 1 );
108147}
0 commit comments