1c779e96158cbac4c62df8e2053ab6a933eba5868Chandler Carruth//===- llvm/unittest/IR/WaymarkTest.cpp - getUser() unit tests ------------===//
29a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif//
39a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif//                     The LLVM Compiler Infrastructure
49a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif//
59a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif// This file is distributed under the University of Illinois Open Source
69a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif// License. See LICENSE.TXT for details.
79a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif//
89a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif//===----------------------------------------------------------------------===//
99a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif
109a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif// we perform white-box tests
119a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif//
12db3a9e64f856e3a233a427da1f3969fd3a65a438Bob Wilson#include "llvm/IR/Constants.h"
130b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
140b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
169a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif#include "gtest/gtest.h"
179a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif#include <algorithm>
189a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif
199a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greifnamespace llvm {
209a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greifnamespace {
219a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif
229a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor GreifConstant *char2constant(char c) {
239a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  return ConstantInt::get(Type::getInt8Ty(getGlobalContext()), c);
249a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif}
25d54393153a2d560446881ed4eeacc4d782882d11Gabor Greif
269a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif
279a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor GreifTEST(WaymarkTest, NativeArray) {
289a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  static uint8_t tail[22] = "s02s33s30y2y0s1x0syxS";
299a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  Value * values[22];
309a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  std::transform(tail, tail + 22, values, char2constant);
31bde0f0f225c8504bec62e9e3c39f1d4573c0ee77NAKAMURA Takumi  FunctionType *FT = FunctionType::get(Type::getVoidTy(getGlobalContext()), true);
329a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  Function *F = Function::Create(FT, GlobalValue::ExternalLinkage);
33bde0f0f225c8504bec62e9e3c39f1d4573c0ee77NAKAMURA Takumi  const CallInst *A = CallInst::Create(F, makeArrayRef(values));
34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  ASSERT_NE(A, (const CallInst*)nullptr);
359a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  ASSERT_EQ(1U + 22, A->getNumOperands());
36bde0f0f225c8504bec62e9e3c39f1d4573c0ee77NAKAMURA Takumi  const Use *U = &A->getOperandUse(0);
37bde0f0f225c8504bec62e9e3c39f1d4573c0ee77NAKAMURA Takumi  const Use *Ue = &A->getOperandUse(22);
389a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  for (; U != Ue; ++U)
399a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  {
40d54393153a2d560446881ed4eeacc4d782882d11Gabor Greif    EXPECT_EQ(A, U->getUser());
419a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  }
42d422e9f114ec11073a63e0fa9ecbfe3aeedf0fbbNAKAMURA Takumi  delete A;
439a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif}
449a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif
459a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor GreifTEST(WaymarkTest, TwoBit) {
46d54393153a2d560446881ed4eeacc4d782882d11Gabor Greif  Use* many = (Use*)calloc(sizeof(Use), 8212 + 1);
479a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  ASSERT_TRUE(many);
48bde0f0f225c8504bec62e9e3c39f1d4573c0ee77NAKAMURA Takumi  Use::initTags(many, many + 8212);
4931659fa066b00afeea38d36ba87b531a4d7313d7Dmitri Gribenko  for (Use *U = many, *Ue = many + 8212 - 1; U != Ue; ++U)
509a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  {
5131659fa066b00afeea38d36ba87b531a4d7313d7Dmitri Gribenko    EXPECT_EQ(reinterpret_cast<User *>(Ue + 1), U->getUser());
529a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif  }
53d422e9f114ec11073a63e0fa9ecbfe3aeedf0fbbNAKAMURA Takumi  free(many);
549a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif}
559a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif
569a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif}  // end anonymous namespace
579a5f90a170ecb4fac028fd85f1affd6dfe13bf16Gabor Greif}  // end namespace llvm
58