Skip to content

Commit 1f6797a

Browse files
committed
Check more methods
1 parent ca713e4 commit 1f6797a

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

llvm/unittests/IR/AbstractCallSiteTest.cpp

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
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

5770
TEST(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

82112
TEST(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

Comments
 (0)