1c779e96158cbac4c62df8e2053ab6a933eba5868Chandler Carruth//===- llvm/unittest/IR/VerifierTest.cpp - Verifier unit tests ------------===// 26a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky// 36a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky// The LLVM Compiler Infrastructure 46a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky// 56a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky// This file is distributed under the University of Illinois Open Source 66a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky// License. See LICENSE.TXT for details. 76a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky// 86a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky//===----------------------------------------------------------------------===// 96a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Verifier.h" 110b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 120b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 130b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 140b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalAlias.h" 150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 196a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "gtest/gtest.h" 206a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 216a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewyckynamespace llvm { 226a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewyckynamespace { 236a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 246a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick LewyckyTEST(VerifierTest, Branch_i1) { 256a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky LLVMContext &C = getGlobalContext(); 26415b33f161537be38be213cb7cb89314173f6549Rafael Espindola Module M("M", C); 276a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), /*isVarArg=*/false); 28415b33f161537be38be213cb7cb89314173f6549Rafael Espindola Function *F = cast<Function>(M.getOrInsertFunction("foo", FTy)); 29415b33f161537be38be213cb7cb89314173f6549Rafael Espindola BasicBlock *Entry = BasicBlock::Create(C, "entry", F); 30415b33f161537be38be213cb7cb89314173f6549Rafael Espindola BasicBlock *Exit = BasicBlock::Create(C, "exit", F); 316a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky ReturnInst::Create(C, Exit); 326a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 336a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky // To avoid triggering an assertion in BranchInst::Create, we first create 346a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky // a branch with an 'i1' condition ... 356a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 366a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky Constant *False = ConstantInt::getFalse(C); 376a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky BranchInst *BI = BranchInst::Create(Exit, Exit, False, Entry); 386a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 396a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky // ... then use setOperand to redirect it to a value of different type. 406a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 416a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky Constant *Zero32 = ConstantInt::get(IntegerType::get(C, 32), 0); 426a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky BI->setOperand(0, Zero32); 436a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(verifyFunction(*F)); 456a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky} 466a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 47ae5758bac75f561f8aa519476942e02be73022e4Bill WendlingTEST(VerifierTest, InvalidRetAttribute) { 48ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling LLVMContext &C = getGlobalContext(); 49ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling Module M("M", C); 50ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling FunctionType *FTy = FunctionType::get(Type::getInt32Ty(C), /*isVarArg=*/false); 51ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling Function *F = cast<Function>(M.getOrInsertFunction("foo", FTy)); 52ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling AttributeSet AS = F->getAttributes(); 53ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling F->setAttributes(AS.addAttribute(C, AttributeSet::ReturnIndex, 54ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling Attribute::UWTable)); 55ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling 56ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling std::string Error; 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_string_ostream ErrorOS(Error); 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(verifyModule(M, &ErrorOS)); 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(StringRef(ErrorOS.str()).startswith( 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Attribute 'uwtable' only applies to functions!")); 61ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling} 62ae5758bac75f561f8aa519476942e02be73022e4Bill Wendling 63cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga NainarTEST(VerifierTest, CrossModuleRef) { 64cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar LLVMContext &C = getGlobalContext(); 65cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Module M1("M1", C); 66cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Module M2("M2", C); 67cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Module M3("M2", C); 68cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar FunctionType *FTy = FunctionType::get(Type::getInt32Ty(C), /*isVarArg=*/false); 69cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Function *F1 = cast<Function>(M1.getOrInsertFunction("foo1", FTy)); 70cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Function *F2 = cast<Function>(M2.getOrInsertFunction("foo2", FTy)); 71cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Function *F3 = cast<Function>(M3.getOrInsertFunction("foo3", FTy)); 72cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 73cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar BasicBlock *Entry1 = BasicBlock::Create(C, "entry", F1); 74cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar BasicBlock *Entry3 = BasicBlock::Create(C, "entry", F3); 75cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 76cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // BAD: Referencing function in another module 77cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CallInst::Create(F2,"call",Entry1); 78cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 79cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // BAD: Referencing personality routine in another module 80cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar F3->setPersonalityFn(F2); 81cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 82cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // Fill in the body 83cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Constant *ConstZero = ConstantInt::get(Type::getInt32Ty(C), 0); 84cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ReturnInst::Create(C, ConstZero, Entry1); 85cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ReturnInst::Create(C, ConstZero, Entry3); 86cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 87cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar std::string Error; 88cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar raw_string_ostream ErrorOS(Error); 89cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar EXPECT_FALSE(verifyModule(M2, &ErrorOS)); 90cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar EXPECT_TRUE(verifyModule(M1, &ErrorOS)); 91cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar EXPECT_TRUE(StringRef(ErrorOS.str()).equals( 92cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "Referencing function in another module!\n" 93cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar " %call = call i32 @foo2()\n" 94cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "; ModuleID = 'M1'\n" 95cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "i32 ()* @foo2\n" 96cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "; ModuleID = 'M2'\n")); 97cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 98cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Error.clear(); 99cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar EXPECT_TRUE(verifyModule(M3, &ErrorOS)); 100cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar EXPECT_TRUE(StringRef(ErrorOS.str()).startswith( 101cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar "Referencing personality function in another module!")); 102cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 103cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // Erase bad methods to avoid triggering an assertion failure on destruction 104cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar F1->eraseFromParent(); 105cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar F3->eraseFromParent(); 106cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar} 107cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 108cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 109cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 1106a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky} 1116a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky} 112