From b0e0513b4dfd22817bc076301009bf450ea083e8 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 11 Aug 2015 18:17:45 +0000 Subject: [PATCH 1/1] Fix UB in MCJIT test cases that relied on union type punning Reviewers: lhames, aaron.ballman Differential Revision: http://reviews.llvm.org/D11779 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244644 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../ExecutionEngine/MCJIT/MCJITCAPITest.cpp | 82 +++++++------------ 1 file changed, 30 insertions(+), 52 deletions(-) diff --git a/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp b/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp index cdc52a39b5f..85cabdbd41a 100644 --- a/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp +++ b/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp @@ -339,14 +339,11 @@ TEST_F(MCJITCAPITest, simple_function) { buildMCJITOptions(); buildMCJITEngine(); buildAndRunPasses(); - - union { - void *raw; - int (*usable)(); - } functionPointer; - functionPointer.raw = LLVMGetPointerToGlobal(Engine, Function); - - EXPECT_EQ(42, functionPointer.usable()); + + auto *functionPointer = reinterpret_cast( + reinterpret_cast(LLVMGetPointerToGlobal(Engine, Function))); + + EXPECT_EQ(42, functionPointer()); } TEST_F(MCJITCAPITest, gva) { @@ -389,14 +386,11 @@ TEST_F(MCJITCAPITest, custom_memory_manager) { useRoundTripSectionMemoryManager(); buildMCJITEngine(); buildAndRunPasses(); - - union { - void *raw; - int (*usable)(); - } functionPointer; - functionPointer.raw = LLVMGetPointerToGlobal(Engine, Function); - - EXPECT_EQ(42, functionPointer.usable()); + + auto *functionPointer = reinterpret_cast( + reinterpret_cast(LLVMGetPointerToGlobal(Engine, Function))); + + EXPECT_EQ(42, functionPointer()); EXPECT_TRUE(didCallAllocateCodeSection); } @@ -412,14 +406,11 @@ TEST_F(MCJITCAPITest, stackmap_creates_compact_unwind_on_darwin) { useRoundTripSectionMemoryManager(); buildMCJITEngine(); buildAndRunOptPasses(); - - union { - void *raw; - int (*usable)(); - } functionPointer; - functionPointer.raw = LLVMGetPointerToGlobal(Engine, Function); - - EXPECT_EQ(42, functionPointer.usable()); + + auto *functionPointer = reinterpret_cast( + reinterpret_cast(LLVMGetPointerToGlobal(Engine, Function))); + + EXPECT_EQ(42, functionPointer()); EXPECT_TRUE(didCallAllocateCodeSection); // Up to this point, the test is specific only to X86-64. But this next @@ -446,21 +437,15 @@ TEST_F(MCJITCAPITest, reserve_allocation_space) { Options.MCJMM = wrap(MM); buildMCJITEngine(); buildAndRunPasses(); - - union { - void *raw; - int (*usable)(); - } GetGlobalFct; - GetGlobalFct.raw = LLVMGetPointerToGlobal(Engine, Function); - - union { - void *raw; - void (*usable)(int); - } SetGlobalFct; - SetGlobalFct.raw = LLVMGetPointerToGlobal(Engine, Function2); - - SetGlobalFct.usable(789); - EXPECT_EQ(789, GetGlobalFct.usable()); + + auto GetGlobalFct = reinterpret_cast( + reinterpret_cast(LLVMGetPointerToGlobal(Engine, Function))); + + auto SetGlobalFct = reinterpret_cast( + reinterpret_cast(LLVMGetPointerToGlobal(Engine, Function2))); + + SetGlobalFct(789); + EXPECT_EQ(789, GetGlobalFct()); EXPECT_LE(MM->UsedCodeSize, MM->ReservedCodeSize); EXPECT_LE(MM->UsedDataSizeRO, MM->ReservedDataSizeRO); EXPECT_LE(MM->UsedDataSizeRW, MM->ReservedDataSizeRW); @@ -478,13 +463,10 @@ TEST_F(MCJITCAPITest, yield) { LLVMContextSetYieldCallback(C, yield, nullptr); buildAndRunPasses(); - union { - void *raw; - int (*usable)(); - } functionPointer; - functionPointer.raw = LLVMGetPointerToGlobal(Engine, Function); + auto *functionPointer = reinterpret_cast( + reinterpret_cast(LLVMGetPointerToGlobal(Engine, Function))); - EXPECT_EQ(42, functionPointer.usable()); + EXPECT_EQ(42, functionPointer()); EXPECT_TRUE(didCallYield); } @@ -514,13 +496,9 @@ TEST_F(MCJITCAPITest, addGlobalMapping) { buildMCJITOptions(); buildMCJITEngine(); - union { - int (*raw)(); - void *usable; - } functionPointer; - functionPointer.raw = &localTestFunc; - - LLVMAddGlobalMapping(Engine, MappedFn, functionPointer.usable); + LLVMAddGlobalMapping( + Engine, MappedFn, + reinterpret_cast(reinterpret_cast(&localTestFunc))); buildAndRunPasses(); -- 2.34.1