[llvm-commits] [llvm] r78127 - in /llvm/trunk: lib/ExecutionEngine/ExecutionEngine.cpp unittests/ExecutionEngine/ExecutionEngineTest.cpp unittests/ExecutionEngine/Makefile
Chris Lattner
clattner at apple.com
Tue Aug 4 19:30:05 PDT 2009
On Aug 4, 2009, at 4:53 PM, Jeffrey Yasskin wrote:
> Author: jyasskin
> Date: Tue Aug 4 18:53:16 2009
> New Revision: 78127
>
> URL: http://llvm.org/viewvc/llvm-project?rev=78127&view=rev
> Log:
> Make ExecutionEngine::updateGlobalMapping(GV, NULL) properly remove
> GV's old
> address from the reverse mapping, and add a test that this works now.
Hey Jeffrey,
Should the GlobalMapping move to using AssertingVH? I think that
would define this class of bugs away.
-Chris
>
> Added:
> llvm/trunk/unittests/ExecutionEngine/ExecutionEngineTest.cpp
> Modified:
> llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> llvm/trunk/unittests/ExecutionEngine/Makefile
>
> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=78127&r1=78126&r2=78127&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Tue Aug 4
> 18:53:16 2009
> @@ -179,7 +179,7 @@
> }
>
> if (!state.getGlobalAddressReverseMap(locked).empty())
> - state.getGlobalAddressReverseMap(locked).erase(Addr);
> + state.getGlobalAddressReverseMap(locked).erase(OldVal);
> return OldVal;
> }
>
>
> Added: llvm/trunk/unittests/ExecutionEngine/ExecutionEngineTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/ExecutionEngineTest.cpp?rev=78127&view=auto
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/unittests/ExecutionEngine/ExecutionEngineTest.cpp
> (added)
> +++ llvm/trunk/unittests/ExecutionEngine/ExecutionEngineTest.cpp Tue
> Aug 4 18:53:16 2009
> @@ -0,0 +1,92 @@
> +//===- ExecutionEngineTest.cpp - Unit tests for ExecutionEngine
> -----------===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open
> Source
> +// License. See LICENSE.TXT for details.
> +//
> +//
> =
> =
> =
> ----------------------------------------------------------------------=
> ==//
> +
> +#include "llvm/DerivedTypes.h"
> +#include "llvm/GlobalVariable.h"
> +#include "llvm/LLVMContext.h"
> +#include "llvm/Module.h"
> +#include "llvm/ADT/OwningPtr.h"
> +#include "llvm/ExecutionEngine/Interpreter.h"
> +#include "gtest/gtest.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +class ExecutionEngineTest : public testing::Test {
> +protected:
> + ExecutionEngineTest()
> + : M(new Module("<main>", getGlobalContext())),
> + Engine(EngineBuilder(M).create()) {
> + }
> +
> + virtual void SetUp() {
> + ASSERT_TRUE(Engine.get() != NULL);
> + }
> +
> + GlobalVariable *NewExtGlobal(const Type *T, const Twine &Name) {
> + return new GlobalVariable(*M, T, false, // Not constant.
> + GlobalValue::ExternalLinkage, NULL,
> Name);
> + }
> +
> + Module *const M;
> + const OwningPtr<ExecutionEngine> Engine;
> +};
> +
> +TEST_F(ExecutionEngineTest, ForwardGlobalMapping) {
> + GlobalVariable *G1 = NewExtGlobal(Type::Int32Ty, "Global1");
> + int32_t Mem1 = 3;
> + Engine->addGlobalMapping(G1, &Mem1);
> + EXPECT_EQ(&Mem1, Engine->getPointerToGlobalIfAvailable(G1));
> + int32_t Mem2 = 4;
> + Engine->updateGlobalMapping(G1, &Mem2);
> + EXPECT_EQ(&Mem2, Engine->getPointerToGlobalIfAvailable(G1));
> + Engine->updateGlobalMapping(G1, NULL);
> + EXPECT_EQ(NULL, Engine->getPointerToGlobalIfAvailable(G1));
> + Engine->updateGlobalMapping(G1, &Mem2);
> + EXPECT_EQ(&Mem2, Engine->getPointerToGlobalIfAvailable(G1));
> +
> + GlobalVariable *G2 = NewExtGlobal(Type::Int32Ty, "Global1");
> + EXPECT_EQ(NULL, Engine->getPointerToGlobalIfAvailable(G2))
> + << "The NULL return shouldn't depend on having called"
> + << " updateGlobalMapping(..., NULL)";
> + // Check that update...() can be called before add...().
> + Engine->updateGlobalMapping(G2, &Mem1);
> + EXPECT_EQ(&Mem1, Engine->getPointerToGlobalIfAvailable(G2));
> + EXPECT_EQ(&Mem2, Engine->getPointerToGlobalIfAvailable(G1))
> + << "A second mapping shouldn't affect the first.";
> +}
> +
> +TEST_F(ExecutionEngineTest, ReverseGlobalMapping) {
> + GlobalVariable *G1 = NewExtGlobal(Type::Int32Ty, "Global1");
> +
> + int32_t Mem1 = 3;
> + Engine->addGlobalMapping(G1, &Mem1);
> + EXPECT_EQ(G1, Engine->getGlobalValueAtAddress(&Mem1));
> + int32_t Mem2 = 4;
> + Engine->updateGlobalMapping(G1, &Mem2);
> + EXPECT_EQ(NULL, Engine->getGlobalValueAtAddress(&Mem1));
> + EXPECT_EQ(G1, Engine->getGlobalValueAtAddress(&Mem2));
> +
> + GlobalVariable *G2 = NewExtGlobal(Type::Int32Ty, "Global2");
> + Engine->updateGlobalMapping(G2, &Mem1);
> + EXPECT_EQ(G2, Engine->getGlobalValueAtAddress(&Mem1));
> + EXPECT_EQ(G1, Engine->getGlobalValueAtAddress(&Mem2));
> + Engine->updateGlobalMapping(G1, NULL);
> + EXPECT_EQ(G2, Engine->getGlobalValueAtAddress(&Mem1))
> + << "Removing one mapping doesn't affect a different one.";
> + EXPECT_EQ(NULL, Engine->getGlobalValueAtAddress(&Mem2));
> + Engine->updateGlobalMapping(G2, &Mem2);
> + EXPECT_EQ(NULL, Engine->getGlobalValueAtAddress(&Mem1));
> + EXPECT_EQ(G2, Engine->getGlobalValueAtAddress(&Mem2))
> + << "Once a mapping is removed, we can point another GV at the"
> + << " now-free address.";
> +}
> +
> +}
>
> Modified: llvm/trunk/unittests/ExecutionEngine/Makefile
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/Makefile?rev=78127&r1=78126&r2=78127&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/unittests/ExecutionEngine/Makefile (original)
> +++ llvm/trunk/unittests/ExecutionEngine/Makefile Tue Aug 4
> 18:53:16 2009
> @@ -8,12 +8,11 @@
> ##=
> =
> =
> ----------------------------------------------------------------------=
> ==##
>
> LEVEL = ../..
> +TESTNAME = ExecutionEngine
> +LINK_COMPONENTS := engine interpreter
>
> include $(LEVEL)/Makefile.config
>
> PARALLEL_DIRS = JIT
>
> -include $(LEVEL)/Makefile.common
> -
> -clean::
> - $(Verb) $(RM) -f *Tests
> +include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list