FunctionTest.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //===- FunctionTest.cpp - Function unit tests -----------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/IR/Function.h"
  9. #include "llvm/IR/Module.h"
  10. #include "gtest/gtest.h"
  11. using namespace llvm;
  12. namespace {
  13. TEST(FunctionTest, hasLazyArguments) {
  14. LLVMContext C;
  15. Type *ArgTypes[] = {Type::getInt8Ty(C), Type::getInt32Ty(C)};
  16. FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), ArgTypes, false);
  17. // Functions start out with lazy arguments.
  18. std::unique_ptr<Function> F(
  19. Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
  20. EXPECT_TRUE(F->hasLazyArguments());
  21. // Checking for empty or size shouldn't force arguments to be instantiated.
  22. EXPECT_FALSE(F->arg_empty());
  23. EXPECT_TRUE(F->hasLazyArguments());
  24. EXPECT_EQ(2u, F->arg_size());
  25. EXPECT_TRUE(F->hasLazyArguments());
  26. // The argument list should be populated at first access.
  27. (void)F->arg_begin();
  28. EXPECT_FALSE(F->hasLazyArguments());
  29. // Checking that getArg gets the arguments from F1 in the correct order.
  30. unsigned i = 0;
  31. for (Argument &A : F->args()) {
  32. EXPECT_EQ(&A, F->getArg(i));
  33. ++i;
  34. }
  35. EXPECT_FALSE(F->hasLazyArguments());
  36. }
  37. TEST(FunctionTest, stealArgumentListFrom) {
  38. LLVMContext C;
  39. Type *ArgTypes[] = {Type::getInt8Ty(C), Type::getInt32Ty(C)};
  40. FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), ArgTypes, false);
  41. std::unique_ptr<Function> F1(
  42. Function::Create(FTy, GlobalValue::ExternalLinkage, "F1"));
  43. std::unique_ptr<Function> F2(
  44. Function::Create(FTy, GlobalValue::ExternalLinkage, "F1"));
  45. EXPECT_TRUE(F1->hasLazyArguments());
  46. EXPECT_TRUE(F2->hasLazyArguments());
  47. // Steal arguments before they've been accessed. Nothing should change; both
  48. // functions should still have lazy arguments.
  49. //
  50. // steal(empty); drop (empty)
  51. F1->stealArgumentListFrom(*F2);
  52. EXPECT_TRUE(F1->hasLazyArguments());
  53. EXPECT_TRUE(F2->hasLazyArguments());
  54. // Save arguments from F1 for later assertions. F1 won't have lazy arguments
  55. // anymore.
  56. SmallVector<Argument *, 4> Args;
  57. for (Argument &A : F1->args())
  58. Args.push_back(&A);
  59. EXPECT_EQ(2u, Args.size());
  60. EXPECT_FALSE(F1->hasLazyArguments());
  61. // Steal arguments from F1 to F2. F1's arguments should be lazy again.
  62. //
  63. // steal(real); drop (empty)
  64. F2->stealArgumentListFrom(*F1);
  65. EXPECT_TRUE(F1->hasLazyArguments());
  66. EXPECT_FALSE(F2->hasLazyArguments());
  67. unsigned I = 0;
  68. for (Argument &A : F2->args()) {
  69. EXPECT_EQ(Args[I], &A);
  70. I++;
  71. }
  72. EXPECT_EQ(2u, I);
  73. // Check that arguments in F1 don't have pointer equality with the saved ones.
  74. // This also instantiates F1's arguments.
  75. I = 0;
  76. for (Argument &A : F1->args()) {
  77. EXPECT_NE(Args[I], &A);
  78. I++;
  79. }
  80. EXPECT_EQ(2u, I);
  81. EXPECT_FALSE(F1->hasLazyArguments());
  82. EXPECT_FALSE(F2->hasLazyArguments());
  83. // Steal back from F2. F2's arguments should be lazy again.
  84. //
  85. // steal(real); drop (real)
  86. F1->stealArgumentListFrom(*F2);
  87. EXPECT_FALSE(F1->hasLazyArguments());
  88. EXPECT_TRUE(F2->hasLazyArguments());
  89. I = 0;
  90. for (Argument &A : F1->args()) {
  91. EXPECT_EQ(Args[I], &A);
  92. I++;
  93. }
  94. EXPECT_EQ(2u, I);
  95. // Steal from F2 a second time. Now both functions should have lazy
  96. // arguments.
  97. //
  98. // steal(empty); drop (real)
  99. F1->stealArgumentListFrom(*F2);
  100. EXPECT_TRUE(F1->hasLazyArguments());
  101. EXPECT_TRUE(F2->hasLazyArguments());
  102. }
  103. // Test setting and removing section information
  104. TEST(FunctionTest, setSection) {
  105. LLVMContext C;
  106. Module M("test", C);
  107. llvm::Function *F =
  108. Function::Create(llvm::FunctionType::get(llvm::Type::getVoidTy(C), false),
  109. llvm::GlobalValue::ExternalLinkage, "F", &M);
  110. F->setSection(".text.test");
  111. EXPECT_TRUE(F->getSection() == ".text.test");
  112. EXPECT_TRUE(F->hasSection());
  113. F->setSection("");
  114. EXPECT_FALSE(F->hasSection());
  115. F->setSection(".text.test");
  116. F->setSection(".text.test2");
  117. EXPECT_TRUE(F->getSection() == ".text.test2");
  118. EXPECT_TRUE(F->hasSection());
  119. }
  120. TEST(FunctionTest, GetPointerAlignment) {
  121. LLVMContext Context;
  122. Type *VoidType(Type::getVoidTy(Context));
  123. FunctionType *FuncType(FunctionType::get(VoidType, false));
  124. std::unique_ptr<Function> Func(Function::Create(
  125. FuncType, GlobalValue::ExternalLinkage));
  126. EXPECT_EQ(MaybeAlign(), Func->getPointerAlignment(DataLayout("")));
  127. EXPECT_EQ(Align(1), Func->getPointerAlignment(DataLayout("Fi8")));
  128. EXPECT_EQ(Align(1), Func->getPointerAlignment(DataLayout("Fn8")));
  129. EXPECT_EQ(Align(2), Func->getPointerAlignment(DataLayout("Fi16")));
  130. EXPECT_EQ(Align(2), Func->getPointerAlignment(DataLayout("Fn16")));
  131. EXPECT_EQ(Align(4), Func->getPointerAlignment(DataLayout("Fi32")));
  132. EXPECT_EQ(Align(4), Func->getPointerAlignment(DataLayout("Fn32")));
  133. Func->setAlignment(Align(4));
  134. EXPECT_EQ(MaybeAlign(), Func->getPointerAlignment(DataLayout("")));
  135. EXPECT_EQ(Align(1), Func->getPointerAlignment(DataLayout("Fi8")));
  136. EXPECT_EQ(Align(4), Func->getPointerAlignment(DataLayout("Fn8")));
  137. EXPECT_EQ(Align(2), Func->getPointerAlignment(DataLayout("Fi16")));
  138. EXPECT_EQ(Align(4), Func->getPointerAlignment(DataLayout("Fn16")));
  139. EXPECT_EQ(Align(4), Func->getPointerAlignment(DataLayout("Fi32")));
  140. EXPECT_EQ(Align(4), Func->getPointerAlignment(DataLayout("Fn32")));
  141. }
  142. } // end namespace