16a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky//===- llvm/unittest/VMCore/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 106a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "llvm/Constants.h" 116a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "llvm/DerivedTypes.h" 126a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "llvm/Function.h" 13bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola#include "llvm/GlobalAlias.h" 14bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola#include "llvm/GlobalVariable.h" 156a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "llvm/Instructions.h" 166a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "llvm/LLVMContext.h" 17bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola#include "llvm/Module.h" 18645a86f5fbabf807e06056325d3dc5a898062753Jeffrey Yasskin#include "llvm/ADT/OwningPtr.h" 196a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "llvm/Analysis/Verifier.h" 206a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky#include "gtest/gtest.h" 216a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 226a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewyckynamespace llvm { 236a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewyckynamespace { 246a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 256a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick LewyckyTEST(VerifierTest, Branch_i1) { 266a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky LLVMContext &C = getGlobalContext(); 276a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky FunctionType *FTy = FunctionType::get(Type::getVoidTy(C), /*isVarArg=*/false); 28645a86f5fbabf807e06056325d3dc5a898062753Jeffrey Yasskin OwningPtr<Function> F(Function::Create(FTy, GlobalValue::ExternalLinkage)); 29645a86f5fbabf807e06056325d3dc5a898062753Jeffrey Yasskin BasicBlock *Entry = BasicBlock::Create(C, "entry", F.get()); 30645a86f5fbabf807e06056325d3dc5a898062753Jeffrey Yasskin BasicBlock *Exit = BasicBlock::Create(C, "exit", F.get()); 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 446a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky EXPECT_TRUE(verifyFunction(*F, ReturnStatusAction)); 456a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky} 466a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky 47bea4626f93c830e31f82cc947df28fdae583cd09Rafael EspindolaTEST(VerifierTest, AliasUnnamedAddr) { 48bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola LLVMContext &C = getGlobalContext(); 49bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola Module M("M", C); 50db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *Ty = Type::getInt8Ty(C); 51bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola Constant *Init = Constant::getNullValue(Ty); 52bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola GlobalVariable *Aliasee = new GlobalVariable(M, Ty, true, 53bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola GlobalValue::ExternalLinkage, 54bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola Init, "foo"); 55bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola GlobalAlias *GA = new GlobalAlias(Type::getInt8PtrTy(C), 56bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola GlobalValue::ExternalLinkage, 57bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola "bar", Aliasee, &M); 58bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola GA->setUnnamedAddr(true); 59bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola std::string Error; 60bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola EXPECT_TRUE(verifyModule(M, ReturnStatusAction, &Error)); 61bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola EXPECT_TRUE(StringRef(Error).startswith("Alias cannot have unnamed_addr")); 62bea4626f93c830e31f82cc947df28fdae583cd09Rafael Espindola} 636a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky} 646a7cb63f6fe4b9ce707e88490e2eeb76cb40ed80Nick Lewycky} 65