ExecutionEngineTest.cpp revision 0a962314fb5b3e9654ad9ab50b7d1b684f154270
10a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin//===- ExecutionEngineTest.cpp - Unit tests for ExecutionEngine -----------===// 20a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin// 30a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin// The LLVM Compiler Infrastructure 40a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin// 50a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin// This file is distributed under the University of Illinois Open Source 60a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin// License. See LICENSE.TXT for details. 70a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin// 80a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin//===----------------------------------------------------------------------===// 90a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 100a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin#include "llvm/DerivedTypes.h" 110a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin#include "llvm/GlobalVariable.h" 120a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin#include "llvm/LLVMContext.h" 130a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin#include "llvm/Module.h" 140a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin#include "llvm/ADT/OwningPtr.h" 150a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin#include "llvm/ExecutionEngine/Interpreter.h" 160a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin#include "gtest/gtest.h" 170a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 180a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskinusing namespace llvm; 190a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 200a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskinnamespace { 210a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 220a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskinclass ExecutionEngineTest : public testing::Test { 230a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskinprotected: 240a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin ExecutionEngineTest() 250a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin : M(new Module("<main>", getGlobalContext())), 260a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine(EngineBuilder(M).create()) { 270a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin } 280a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 290a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin virtual void SetUp() { 300a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin ASSERT_TRUE(Engine.get() != NULL); 310a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin } 320a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 330a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin GlobalVariable *NewExtGlobal(const Type *T, const Twine &Name) { 340a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin return new GlobalVariable(*M, T, false, // Not constant. 350a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin GlobalValue::ExternalLinkage, NULL, Name); 360a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin } 370a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 380a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Module *const M; 390a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin const OwningPtr<ExecutionEngine> Engine; 400a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin}; 410a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 420a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey YasskinTEST_F(ExecutionEngineTest, ForwardGlobalMapping) { 430a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin GlobalVariable *G1 = NewExtGlobal(Type::Int32Ty, "Global1"); 440a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin int32_t Mem1 = 3; 450a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->addGlobalMapping(G1, &Mem1); 460a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(&Mem1, Engine->getPointerToGlobalIfAvailable(G1)); 470a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin int32_t Mem2 = 4; 480a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G1, &Mem2); 490a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(&Mem2, Engine->getPointerToGlobalIfAvailable(G1)); 500a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G1, NULL); 510a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(NULL, Engine->getPointerToGlobalIfAvailable(G1)); 520a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G1, &Mem2); 530a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(&Mem2, Engine->getPointerToGlobalIfAvailable(G1)); 540a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 550a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin GlobalVariable *G2 = NewExtGlobal(Type::Int32Ty, "Global1"); 560a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(NULL, Engine->getPointerToGlobalIfAvailable(G2)) 570a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin << "The NULL return shouldn't depend on having called" 580a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin << " updateGlobalMapping(..., NULL)"; 590a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin // Check that update...() can be called before add...(). 600a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G2, &Mem1); 610a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(&Mem1, Engine->getPointerToGlobalIfAvailable(G2)); 620a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(&Mem2, Engine->getPointerToGlobalIfAvailable(G1)) 630a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin << "A second mapping shouldn't affect the first."; 640a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin} 650a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 660a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey YasskinTEST_F(ExecutionEngineTest, ReverseGlobalMapping) { 670a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin GlobalVariable *G1 = NewExtGlobal(Type::Int32Ty, "Global1"); 680a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 690a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin int32_t Mem1 = 3; 700a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->addGlobalMapping(G1, &Mem1); 710a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(G1, Engine->getGlobalValueAtAddress(&Mem1)); 720a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin int32_t Mem2 = 4; 730a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G1, &Mem2); 740a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(NULL, Engine->getGlobalValueAtAddress(&Mem1)); 750a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(G1, Engine->getGlobalValueAtAddress(&Mem2)); 760a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 770a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin GlobalVariable *G2 = NewExtGlobal(Type::Int32Ty, "Global2"); 780a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G2, &Mem1); 790a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(G2, Engine->getGlobalValueAtAddress(&Mem1)); 800a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(G1, Engine->getGlobalValueAtAddress(&Mem2)); 810a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G1, NULL); 820a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(G2, Engine->getGlobalValueAtAddress(&Mem1)) 830a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin << "Removing one mapping doesn't affect a different one."; 840a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(NULL, Engine->getGlobalValueAtAddress(&Mem2)); 850a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin Engine->updateGlobalMapping(G2, &Mem2); 860a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(NULL, Engine->getGlobalValueAtAddress(&Mem1)); 870a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin EXPECT_EQ(G2, Engine->getGlobalValueAtAddress(&Mem2)) 880a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin << "Once a mapping is removed, we can point another GV at the" 890a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin << " now-free address."; 900a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin} 910a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin 920a962314fb5b3e9654ad9ab50b7d1b684f154270Jeffrey Yasskin} 93