add unit test for waymarking algorithm (Use::getUser)
authorGabor Greif <ggreif@gmail.com>
Mon, 12 Nov 2012 10:01:17 +0000 (10:01 +0000)
committerGabor Greif <ggreif@gmail.com>
Mon, 12 Nov 2012 10:01:17 +0000 (10:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167720 91177308-0d34-0410-b5e6-96231b3b80d8

unittests/VMCore/CMakeLists.txt
unittests/VMCore/WaymarkTest.cpp [new file with mode: 0644]

index 4025c7a91fb3b0799702a10402e9443d9f14e17d..8d8bb3bb4d982d9d88a340ef4cd24a5e1c53c934 100644 (file)
@@ -16,6 +16,7 @@ set(VMCoreSources
   TypesTest.cpp
   ValueMapTest.cpp
   VerifierTest.cpp
+  WaymarkTest.cpp
   )
 
 # MSVC9 and 8 cannot compile ValueMapTest.cpp due to their bug.
diff --git a/unittests/VMCore/WaymarkTest.cpp b/unittests/VMCore/WaymarkTest.cpp
new file mode 100644 (file)
index 0000000..41228c9
--- /dev/null
@@ -0,0 +1,57 @@
+//===- llvm/unittest/VMCore/WaymarkTest.cpp - getUser() unit tests --------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// we perform white-box tests
+//
+#define private public
+#include "llvm/Use.h"
+#undef private
+#include "llvm/Function.h"
+#include "llvm/Instructions.h"
+#include "llvm/LLVMContext.h"
+#include "gtest/gtest.h"
+#include <algorithm>
+
+namespace llvm {
+namespace {
+
+Constant *char2constant(char c) {
+  return ConstantInt::get(Type::getInt8Ty(getGlobalContext()), c);
+}
+  
+
+TEST(WaymarkTest, NativeArray) {
+  static uint8_t tail[22] = "s02s33s30y2y0s1x0syxS";
+  Value * values[22];
+  std::transform(tail, tail + 22, values, char2constant);
+  FunctionType *FT =   FunctionType::get(Type::getVoidTy(getGlobalContext()), true);
+  Function *F = Function::Create(FT, GlobalValue::ExternalLinkage);
+       const CallInst *A = CallInst::Create(F, makeArrayRef(values));
+  ASSERT_NE(A, (const CallInst*)NULL);
+  ASSERT_EQ(1U + 22, A->getNumOperands());
+       const Use *U = &A->getOperandUse(0);
+       const Use *Ue = &A->getOperandUse(22);
+  for (; U != Ue; ++U)
+  {
+    EXPECT_EQ(Ue + 1, U->getImpliedUser());
+  }
+}
+
+TEST(WaymarkTest, TwoBit) {
+  Use* many = (Use*)calloc(sizeof(Use), 8212);
+  ASSERT_TRUE(many);
+       Use::initTags(many, many + 8212);
+  for (const Use *U = many, *Ue = many + 8212 - 1; U != Ue; ++U)
+  {
+    EXPECT_EQ(Ue + 1, U->getImpliedUser());
+  }
+}
+
+}  // end anonymous namespace
+}  // end namespace llvm