12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===- llvm/unittest/IR/VerifierTest.cpp - Verifier unit tests ------------===// 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The LLVM Compiler Infrastructure 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details. 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===----------------------------------------------------------------------===// 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/Verifier.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/Constants.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/DerivedTypes.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/IR/Function.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/GlobalAlias.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/GlobalVariable.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/Instructions.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/LLVMContext.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/IR/Module.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gtest/gtest.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace llvm { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(VerifierTest, Branch_i1) { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LLVMContext &C = getGlobalContext(); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Module M("M", C); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), /*isVarArg=*/false); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Function *F = cast<Function>(M.getOrInsertFunction("foo", FTy)); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BasicBlock *Entry = BasicBlock::Create(C, "entry", F); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BasicBlock *Exit = BasicBlock::Create(C, "exit", F); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ReturnInst::Create(C, Exit); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // To avoid triggering an assertion in BranchInst::Create, we first create 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // a branch with an 'i1' condition ... 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Constant *False = ConstantInt::getFalse(C); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BranchInst *BI = BranchInst::Create(Exit, Exit, False, Entry); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ... then use setOperand to redirect it to a value of different type. 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Constant *Zero32 = ConstantInt::get(IntegerType::get(C, 32), 0); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BI->setOperand(0, Zero32); 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(verifyFunction(*F)); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(VerifierTest, InvalidRetAttribute) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LLVMContext &C = getGlobalContext(); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Module M("M", C); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FunctionType *FTy = FunctionType::get(Type::getInt32Ty(C), /*isVarArg=*/false); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Function *F = cast<Function>(M.getOrInsertFunction("foo", FTy)); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AttributeSet AS = F->getAttributes(); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) F->setAttributes(AS.addAttribute(C, AttributeSet::ReturnIndex, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Attribute::UWTable)); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string Error; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) raw_string_ostream ErrorOS(Error); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(verifyModule(M, &ErrorOS)); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(StringRef(ErrorOS.str()).startswith( 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Attribute 'uwtable' only applies to functions!")); 61} 62 63} 64} 65