Compare commits
8 Commits
Author | SHA1 | Date |
---|---|---|
Tom Stellard | b3f19ed18b | |
Tom Stellard | 48a8b21ef0 | |
Tom Stellard | ddf4c85987 | |
Tom Stellard | 1a4ccaa8f8 | |
Tom Stellard | 622ff5c1f5 | |
Tom Stellard | 72f153b141 | |
Josh Stone | 6532ccc2ea | |
Tom Stellard | 3f98e69615 |
|
@ -0,0 +1,193 @@
|
|||
From a61fc423f3c043314efd4c0cdb1367de2077ac36 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Fiselier <eric@efcs.ca>
|
||||
Date: Fri, 10 Feb 2017 01:59:20 +0000
|
||||
Subject: [PATCH] [CMake] Fix pthread handling for out-of-tree builds
|
||||
|
||||
LLVM defines `PTHREAD_LIB` which is used by AddLLVM.cmake and various projects
|
||||
to correctly link the threading library when needed. Unfortunately
|
||||
`PTHREAD_LIB` is defined by LLVM's `config-ix.cmake` file which isn't installed
|
||||
and therefore can't be used when configuring out-of-tree builds. This causes
|
||||
such builds to fail since `pthread` isn't being correctly linked.
|
||||
|
||||
This patch attempts to fix that problem by renaming and exporting
|
||||
`LLVM_PTHREAD_LIB` as part of`LLVMConfig.cmake`. I renamed `PTHREAD_LIB`
|
||||
because It seemed likely to cause collisions with downstream users of
|
||||
`LLVMConfig.cmake`.
|
||||
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294690 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
cmake/config-ix.cmake | 2 +-
|
||||
cmake/modules/AddLLVM.cmake | 6 +++---
|
||||
cmake/modules/LLVMConfig.cmake.in | 4 ++++
|
||||
examples/ParallelJIT/CMakeLists.txt | 2 +-
|
||||
lib/CodeGen/CMakeLists.txt | 2 +-
|
||||
lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt | 2 +-
|
||||
lib/Fuzzer/CMakeLists.txt | 4 ++--
|
||||
lib/Support/CMakeLists.txt | 2 +-
|
||||
unittests/ExecutionEngine/Orc/CMakeLists.txt | 2 +-
|
||||
unittests/Support/CMakeLists.txt | 2 +-
|
||||
utils/unittest/CMakeLists.txt | 4 ++--
|
||||
11 files changed, 18 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/cmake/config-ix.cmake b/cmake/config-ix.cmake
|
||||
index 50bcc50..6bd2b53 100755
|
||||
--- a/cmake/config-ix.cmake
|
||||
+++ b/cmake/config-ix.cmake
|
||||
@@ -115,7 +115,7 @@ if(HAVE_LIBPTHREAD)
|
||||
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
|
||||
set(THREADS_HAVE_PTHREAD_ARG Off)
|
||||
find_package(Threads REQUIRED)
|
||||
- set(PTHREAD_LIB ${CMAKE_THREAD_LIBS_INIT})
|
||||
+ set(LLVM_PTHREAD_LIB ${CMAKE_THREAD_LIBS_INIT})
|
||||
endif()
|
||||
|
||||
# Don't look for these libraries on Windows. Also don't look for them if we're
|
||||
diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
|
||||
index b3c7746..cb4171c 100644
|
||||
--- a/cmake/modules/AddLLVM.cmake
|
||||
+++ b/cmake/modules/AddLLVM.cmake
|
||||
@@ -718,11 +718,11 @@ macro(add_llvm_executable name)
|
||||
if(NOT ARG_IGNORE_EXTERNALIZE_DEBUGINFO)
|
||||
llvm_externalize_debuginfo(${name})
|
||||
endif()
|
||||
- if (PTHREAD_LIB)
|
||||
+ if (LLVM_PTHREAD_LIB)
|
||||
# libpthreads overrides some standard library symbols, so main
|
||||
# executable must be linked with it in order to provide consistent
|
||||
# API for all shared libaries loaded by this executable.
|
||||
- target_link_libraries(${name} ${PTHREAD_LIB})
|
||||
+ target_link_libraries(${name} ${LLVM_PTHREAD_LIB})
|
||||
endif()
|
||||
endmacro(add_llvm_executable name)
|
||||
|
||||
@@ -1027,7 +1027,7 @@ function(add_unittest test_suite test_name)
|
||||
# libpthreads overrides some standard library symbols, so main
|
||||
# executable must be linked with it in order to provide consistent
|
||||
# API for all shared libaries loaded by this executable.
|
||||
- target_link_libraries(${test_name} gtest_main gtest ${PTHREAD_LIB})
|
||||
+ target_link_libraries(${test_name} gtest_main gtest ${LLVM_PTHREAD_LIB})
|
||||
|
||||
add_dependencies(${test_suite} ${test_name})
|
||||
get_target_property(test_suite_folder ${test_suite} FOLDER)
|
||||
diff --git a/cmake/modules/LLVMConfig.cmake.in b/cmake/modules/LLVMConfig.cmake.in
|
||||
index 2aea2dc..7a8eb36 100644
|
||||
--- a/cmake/modules/LLVMConfig.cmake.in
|
||||
+++ b/cmake/modules/LLVMConfig.cmake.in
|
||||
@@ -45,6 +45,10 @@ set(LLVM_ENABLE_PIC @LLVM_ENABLE_PIC@)
|
||||
|
||||
set(LLVM_BUILD_32_BITS @LLVM_BUILD_32_BITS@)
|
||||
|
||||
+if (NOT "@LLVM_PTHREAD_LIB@" STREQUAL "")
|
||||
+ set(LLVM_PTHREAD_LIB "@LLVM_PTHREAD_LIB@")
|
||||
+endif()
|
||||
+
|
||||
set(LLVM_ENABLE_PLUGINS @LLVM_ENABLE_PLUGINS@)
|
||||
set(LLVM_EXPORT_SYMBOLS_FOR_PLUGINS @LLVM_EXPORT_SYMBOLS_FOR_PLUGINS@)
|
||||
set(LLVM_PLUGIN_EXT @LLVM_PLUGIN_EXT@)
|
||||
diff --git a/examples/ParallelJIT/CMakeLists.txt b/examples/ParallelJIT/CMakeLists.txt
|
||||
index e85b470..deeee07 100644
|
||||
--- a/examples/ParallelJIT/CMakeLists.txt
|
||||
+++ b/examples/ParallelJIT/CMakeLists.txt
|
||||
@@ -11,4 +11,4 @@ add_llvm_example(ParallelJIT
|
||||
ParallelJIT.cpp
|
||||
)
|
||||
|
||||
-target_link_libraries(ParallelJIT ${PTHREAD_LIB})
|
||||
+target_link_libraries(ParallelJIT ${LLVM_PTHREAD_LIB})
|
||||
diff --git a/lib/CodeGen/CMakeLists.txt b/lib/CodeGen/CMakeLists.txt
|
||||
index a1e5fd4..a9a3d85 100644
|
||||
--- a/lib/CodeGen/CMakeLists.txt
|
||||
+++ b/lib/CodeGen/CMakeLists.txt
|
||||
@@ -150,7 +150,7 @@ add_llvm_library(LLVMCodeGen
|
||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/CodeGen
|
||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/CodeGen/PBQP
|
||||
|
||||
- LINK_LIBS ${PTHREAD_LIB}
|
||||
+ LINK_LIBS ${LLVM_PTHREAD_LIB}
|
||||
|
||||
DEPENDS
|
||||
intrinsics_gen
|
||||
diff --git a/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt b/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt
|
||||
index 3b8c4b9..e6c33b2 100644
|
||||
--- a/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt
|
||||
+++ b/lib/ExecutionEngine/IntelJITEvents/CMakeLists.txt
|
||||
@@ -4,7 +4,7 @@ if( HAVE_LIBDL )
|
||||
set(LLVM_INTEL_JIT_LIBS ${CMAKE_DL_LIBS})
|
||||
endif()
|
||||
|
||||
-set(LLVM_INTEL_JIT_LIBS ${PTHREAD_LIB} ${LLVM_INTEL_JIT_LIBS})
|
||||
+set(LLVM_INTEL_JIT_LIBS ${LLVM_PTHREAD_LIB} ${LLVM_INTEL_JIT_LIBS})
|
||||
|
||||
|
||||
add_llvm_library(LLVMIntelJITEvents
|
||||
diff --git a/lib/Fuzzer/CMakeLists.txt b/lib/Fuzzer/CMakeLists.txt
|
||||
index 5ba126e..f490b36 100644
|
||||
--- a/lib/Fuzzer/CMakeLists.txt
|
||||
+++ b/lib/Fuzzer/CMakeLists.txt
|
||||
@@ -34,12 +34,12 @@ if( LLVM_USE_SANITIZE_COVERAGE )
|
||||
add_library(LLVMFuzzerNoMain STATIC
|
||||
$<TARGET_OBJECTS:LLVMFuzzerNoMainObjects>
|
||||
)
|
||||
- target_link_libraries(LLVMFuzzerNoMain ${PTHREAD_LIB})
|
||||
+ target_link_libraries(LLVMFuzzerNoMain ${LLVM_PTHREAD_LIB})
|
||||
add_library(LLVMFuzzer STATIC
|
||||
FuzzerMain.cpp
|
||||
$<TARGET_OBJECTS:LLVMFuzzerNoMainObjects>
|
||||
)
|
||||
- target_link_libraries(LLVMFuzzer ${PTHREAD_LIB})
|
||||
+ target_link_libraries(LLVMFuzzer ${LLVM_PTHREAD_LIB})
|
||||
|
||||
if( LLVM_INCLUDE_TESTS )
|
||||
add_subdirectory(test)
|
||||
diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt
|
||||
index 3301364..f7cfa76 100644
|
||||
--- a/lib/Support/CMakeLists.txt
|
||||
+++ b/lib/Support/CMakeLists.txt
|
||||
@@ -17,7 +17,7 @@ elseif( CMAKE_HOST_UNIX )
|
||||
if( LLVM_ENABLE_THREADS AND HAVE_LIBATOMIC )
|
||||
set(system_libs ${system_libs} atomic)
|
||||
endif()
|
||||
- set(system_libs ${system_libs} ${PTHREAD_LIB})
|
||||
+ set(system_libs ${system_libs} ${LLVM_PTHREAD_LIB})
|
||||
if ( LLVM_ENABLE_ZLIB AND HAVE_LIBZ )
|
||||
set(system_libs ${system_libs} z)
|
||||
endif()
|
||||
diff --git a/unittests/ExecutionEngine/Orc/CMakeLists.txt b/unittests/ExecutionEngine/Orc/CMakeLists.txt
|
||||
index 68f6d0c..80c344e 100644
|
||||
--- a/unittests/ExecutionEngine/Orc/CMakeLists.txt
|
||||
+++ b/unittests/ExecutionEngine/Orc/CMakeLists.txt
|
||||
@@ -21,4 +21,4 @@ add_llvm_unittest(OrcJITTests
|
||||
RPCUtilsTest.cpp
|
||||
)
|
||||
|
||||
-target_link_libraries(OrcJITTests ${PTHREAD_LIB})
|
||||
+target_link_libraries(OrcJITTests ${LLVM_PTHREAD_LIB})
|
||||
diff --git a/unittests/Support/CMakeLists.txt b/unittests/Support/CMakeLists.txt
|
||||
index 4c9bb5e..ea26079 100644
|
||||
--- a/unittests/Support/CMakeLists.txt
|
||||
+++ b/unittests/Support/CMakeLists.txt
|
||||
@@ -64,4 +64,4 @@ add_llvm_unittest(SupportTests
|
||||
)
|
||||
|
||||
# ManagedStatic.cpp uses <pthread>.
|
||||
-target_link_libraries(SupportTests ${PTHREAD_LIB})
|
||||
+target_link_libraries(SupportTests ${LLVM_PTHREAD_LIB})
|
||||
diff --git a/utils/unittest/CMakeLists.txt b/utils/unittest/CMakeLists.txt
|
||||
index a50733a..b42ac83 100644
|
||||
--- a/utils/unittest/CMakeLists.txt
|
||||
+++ b/utils/unittest/CMakeLists.txt
|
||||
@@ -40,8 +40,8 @@ if (NOT LLVM_ENABLE_THREADS)
|
||||
add_definitions( -DGTEST_HAS_PTHREAD=0 )
|
||||
endif()
|
||||
|
||||
-find_library(PTHREAD_LIBRARY_PATH pthread)
|
||||
-if (PTHREAD_LIBRARY_PATH)
|
||||
+find_library(LLVM_PTHREAD_LIBRARY_PATH pthread)
|
||||
+if (LLVM_PTHREAD_LIBRARY_PATH)
|
||||
list(APPEND LIBS pthread)
|
||||
endif()
|
||||
|
||||
--
|
||||
1.8.3.1
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
From fd80342a58ead0dc7b008ce6ce8523cdea765f5f Mon Sep 17 00:00:00 2001
|
||||
From: Jonas Devlieghere <jonas@devlieghere.com>
|
||||
Date: Wed, 15 Nov 2017 10:57:05 +0000
|
||||
Subject: [PATCH] [DebugInfo] Fix potential CU mismatch for
|
||||
SubprogramScopeDIEs.
|
||||
|
||||
In constructAbstractSubprogramScopeDIE there can be a potential mismatch
|
||||
between `this` and the CU of ContextDIE when a scope is shared between
|
||||
two DISubprograms belonging to a different CU. In that case, `this` is
|
||||
the CU that was specified in the IR, but the CU of ContextDIE is that of
|
||||
the first subprogram that was emitted. This patch fixes the mismatch by
|
||||
looking up the CU of ContextDIE, and switching to use that.
|
||||
|
||||
This fixes PR35212 (https://bugs.llvm.org/show_bug.cgi?id=35212)
|
||||
|
||||
Patch by Philip Craig!
|
||||
|
||||
Differential revision: https://reviews.llvm.org/D39981
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@318289 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 20 ++++++++----
|
||||
lib/CodeGen/AsmPrinter/DwarfDebug.h | 6 +++-
|
||||
test/DebugInfo/cross-cu-scope.ll | 50 +++++++++++++++++++++++++++++
|
||||
3 files changed, 68 insertions(+), 8 deletions(-)
|
||||
create mode 100644 test/DebugInfo/cross-cu-scope.ll
|
||||
|
||||
diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
|
||||
index d904372..eea30a7 100644
|
||||
--- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
|
||||
+++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
|
||||
@@ -616,6 +616,7 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(
|
||||
auto *SP = cast<DISubprogram>(Scope->getScopeNode());
|
||||
|
||||
DIE *ContextDIE;
|
||||
+ DwarfCompileUnit *ContextCU = this;
|
||||
|
||||
if (includeMinimalInlineScopes())
|
||||
ContextDIE = &getUnitDie();
|
||||
@@ -626,18 +627,23 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(
|
||||
else if (auto *SPDecl = SP->getDeclaration()) {
|
||||
ContextDIE = &getUnitDie();
|
||||
getOrCreateSubprogramDIE(SPDecl);
|
||||
- } else
|
||||
+ } else {
|
||||
ContextDIE = getOrCreateContextDIE(resolve(SP->getScope()));
|
||||
+ // The scope may be shared with a subprogram that has already been
|
||||
+ // constructed in another CU, in which case we need to construct this
|
||||
+ // subprogram in the same CU.
|
||||
+ ContextCU = DD->lookupCU(ContextDIE->getUnitDie());
|
||||
+ }
|
||||
|
||||
// Passing null as the associated node because the abstract definition
|
||||
// shouldn't be found by lookup.
|
||||
- AbsDef = &createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr);
|
||||
- applySubprogramAttributesToDefinition(SP, *AbsDef);
|
||||
+ AbsDef = &ContextCU->createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, nullptr);
|
||||
+ ContextCU->applySubprogramAttributesToDefinition(SP, *AbsDef);
|
||||
|
||||
- if (!includeMinimalInlineScopes())
|
||||
- addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
||||
- if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, *AbsDef))
|
||||
- addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
|
||||
+ if (!ContextCU->includeMinimalInlineScopes())
|
||||
+ ContextCU->addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
||||
+ if (DIE *ObjectPointer = ContextCU->createAndAddScopeChildren(Scope, *AbsDef))
|
||||
+ ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
|
||||
}
|
||||
|
||||
DIE *DwarfCompileUnit::constructImportedEntityDIE(
|
||||
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h
|
||||
index 253e3f0..9ade921 100644
|
||||
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.h
|
||||
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h
|
||||
@@ -280,7 +280,7 @@ class DwarfDebug : public DebugHandlerBase {
|
||||
// 0, referencing the comp_dir of all the type units that use it.
|
||||
MCDwarfDwoLineTable SplitTypeUnitFileTable;
|
||||
/// @}
|
||||
-
|
||||
+
|
||||
/// True iff there are multiple CUs in this module.
|
||||
bool SingleCU;
|
||||
bool IsDarwin;
|
||||
@@ -555,6 +555,10 @@ public:
|
||||
/// A helper function to check whether the DIE for a given Scope is
|
||||
/// going to be null.
|
||||
bool isLexicalScopeDIENull(LexicalScope *Scope);
|
||||
+
|
||||
+ /// Find the matching DwarfCompileUnit for the given CU DIE.
|
||||
+ DwarfCompileUnit *lookupCU(const DIE *Die) { return CUDieMap.lookup(Die); }
|
||||
+
|
||||
};
|
||||
} // End of namespace llvm
|
||||
|
||||
diff --git a/test/DebugInfo/cross-cu-scope.ll b/test/DebugInfo/cross-cu-scope.ll
|
||||
new file mode 100644
|
||||
index 0000000..7c71f27
|
||||
--- /dev/null
|
||||
+++ b/test/DebugInfo/cross-cu-scope.ll
|
||||
@@ -0,0 +1,50 @@
|
||||
+; RUN: %llc_dwarf %s -filetype=obj -o %t
|
||||
+; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
|
||||
+
|
||||
+; Reduced test case from PR35212. Two DISubprogram belong to a different CU but
|
||||
+; share a scope. Both are declarations and end up in the scope's CU. We want to
|
||||
+; check that the CU from the context DIE is used (rather than from the IR).
|
||||
+; This manifests itself by the DW_base_type ending up in the second CU, rather
|
||||
+; than in the first one as specified in the IR.
|
||||
+
|
||||
+; CHECK: DW_TAG_compile_unit
|
||||
+; CHECK-NEXT: discriminator 0
|
||||
+; CHECK: DW_TAG_compile_unit
|
||||
+; CHECK-NEXT: discriminator 1
|
||||
+; CHECK: DW_TAG_structure_type
|
||||
+; CHECK-NOT: NULL
|
||||
+; CHECK: DW_TAG_subprogram
|
||||
+; CHECK-NOT: NULL
|
||||
+; CHECK: DW_TAG_formal_parameter
|
||||
+; CHECK-NOT: NULL
|
||||
+; CHECK: DW_AT_type{{.*}}{[[USIZE_LABEL:0x[0-9a-f]+]]}
|
||||
+; CHECK: NULL
|
||||
+; CHECK: [[USIZE_LABEL]]: DW_TAG_base_type
|
||||
+; CHECK-NOT: NULL
|
||||
+; CHECK: DW_AT_name{{.*}}"usize"
|
||||
+
|
||||
+define hidden void @foo() !dbg !4 {
|
||||
+ ret void, !dbg !7
|
||||
+}
|
||||
+
|
||||
+!llvm.dbg.cu = !{!0, !2}
|
||||
+!llvm.module.flags = !{!3}
|
||||
+
|
||||
+!0 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !1, producer: "clang LLVM (rustc version 1.23.0-nightly (discriminator 0))", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
|
||||
+!1 = !DIFile(filename: "../lib.rs", directory: "/home/alex/code/rust4/lol")
|
||||
+!2 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !1, producer: "clang LLVM (rustc version 1.23.0-nightly (discriminator 1))", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
|
||||
+!3 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
+!4 = distinct !DISubprogram(name: "clone<alloc::string::String>", linkageName: "_ZN5alloc3vec8{{impl}}28clone<alloc::string::String>E", scope: null, file: !1, line: 1519, type: !5, isLocal: false, isDefinition: true, scopeLine: 1519, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !6, variables: !6)
|
||||
+!5 = !DISubroutineType(types: !6)
|
||||
+!6 = !{}
|
||||
+!7 = !DILocation(line: 1612, scope: !8, inlinedAt: !11)
|
||||
+!8 = distinct !DILexicalBlock(scope: !9, file: !1, line: 86, column: 12)
|
||||
+!9 = distinct !DISubprogram(name: "allocate_in<alloc::string::String,alloc::heap::Heap>", linkageName: "_ZN5alloc7raw_vec8{{impl}}52allocate_in<alloc::string::String,alloc::heap::Heap>E", scope: !10, file: !1, line: 82, type: !5, isLocal: false, isDefinition: true, scopeLine: 82, flags: DIFlagPrototyped, isOptimized: true, unit: !2, templateParams: !6, variables: !6)
|
||||
+!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "RawVec<alloc::string::String, alloc::heap::Heap>", file: !1, size: 128, align: 64, elements: !6, identifier: "5c6e4db16d2c64555e40661d70c4d81e")
|
||||
+!11 = distinct !DILocation(line: 86, scope: !8, inlinedAt: !12)
|
||||
+!12 = distinct !DILocation(line: 141, scope: !13, inlinedAt: !17)
|
||||
+!13 = distinct !DISubprogram(name: "with_capacity<alloc::string::String>", linkageName: "_ZN5alloc7raw_vec8{{impl}}36with_capacity<alloc::string::String>E", scope: !10, file: !1, line: 140, type: !5, isLocal: false, isDefinition: true, scopeLine: 140, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !6, variables: !14)
|
||||
+!14 = !{!15}
|
||||
+!15 = !DILocalVariable(name: "cap", arg: 1, scope: !13, file: !1, line: 1, type: !16)
|
||||
+!16 = !DIBasicType(name: "usize", size: 64, encoding: DW_ATE_unsigned)
|
||||
+!17 = !DILocation(line: 1521, scope: !4)
|
||||
--
|
||||
2.9.3
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
From 66e43b0a8e5616a4762eedee9bd030a49b9d6545 Mon Sep 17 00:00:00 2001
|
||||
From: Guozhi Wei <carrot@google.com>
|
||||
Date: Thu, 2 Mar 2017 21:07:59 +0000
|
||||
Subject: [PATCH 1/3] [PPC] Fix code generation for bswap(int32) followed by
|
||||
store16
|
||||
|
||||
This patch fixes pr32063.
|
||||
|
||||
Current code in PPCTargetLowering::PerformDAGCombine can transform
|
||||
|
||||
bswap
|
||||
store
|
||||
|
||||
into a single PPCISD::STBRX instruction. but it doesn't consider the case that the operand size of bswap may be larger than store size. When it occurs, we need 2 modifications,
|
||||
|
||||
1 For the last operand of PPCISD::STBRX, we should not use DAG.getValueType(N->getOperand(1).getValueType()), instead we should use cast<StoreSDNode>(N)->getMemoryVT().
|
||||
|
||||
2 Before PPCISD::STBRX, we need to shift the original operand of bswap to the right side.
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D30362
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296811 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
lib/Target/PowerPC/PPCISelLowering.cpp | 12 ++++++++++--
|
||||
test/CodeGen/PowerPC/pr32063.ll | 16 ++++++++++++++++
|
||||
2 files changed, 26 insertions(+), 2 deletions(-)
|
||||
create mode 100644 test/CodeGen/PowerPC/pr32063.ll
|
||||
|
||||
diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
index 6313082..c8eb6f1 100644
|
||||
--- a/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
+++ b/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
@@ -11226,9 +11226,17 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
if (BSwapOp.getValueType() == MVT::i16)
|
||||
BSwapOp = DAG.getNode(ISD::ANY_EXTEND, dl, MVT::i32, BSwapOp);
|
||||
|
||||
+ // If the type of BSWAP operand is wider than stored memory width
|
||||
+ // it need to be shifted to the right side before STBRX.
|
||||
+ EVT mVT = cast<StoreSDNode>(N)->getMemoryVT();
|
||||
+ if (Op1VT.bitsGT(mVT)) {
|
||||
+ int shift = Op1VT.getSizeInBits() - mVT.getSizeInBits();
|
||||
+ BSwapOp = DAG.getNode(ISD::SRL, dl, Op1VT, BSwapOp,
|
||||
+ DAG.getConstant(shift, dl, MVT::i32));
|
||||
+ }
|
||||
+
|
||||
SDValue Ops[] = {
|
||||
- N->getOperand(0), BSwapOp, N->getOperand(2),
|
||||
- DAG.getValueType(N->getOperand(1).getValueType())
|
||||
+ N->getOperand(0), BSwapOp, N->getOperand(2), DAG.getValueType(mVT)
|
||||
};
|
||||
return
|
||||
DAG.getMemIntrinsicNode(PPCISD::STBRX, dl, DAG.getVTList(MVT::Other),
|
||||
diff --git a/test/CodeGen/PowerPC/pr32063.ll b/test/CodeGen/PowerPC/pr32063.ll
|
||||
new file mode 100644
|
||||
index 0000000..f031ec8
|
||||
--- /dev/null
|
||||
+++ b/test/CodeGen/PowerPC/pr32063.ll
|
||||
@@ -0,0 +1,16 @@
|
||||
+; RUN: llc -O2 < %s | FileCheck %s
|
||||
+target triple = "powerpc64le-linux-gnu"
|
||||
+
|
||||
+define void @foo(i32 %v, i16* %p) {
|
||||
+ %1 = and i32 %v, -65536
|
||||
+ %2 = tail call i32 @llvm.bswap.i32(i32 %1)
|
||||
+ %conv = trunc i32 %2 to i16
|
||||
+ store i16 %conv, i16* %p
|
||||
+ ret void
|
||||
+
|
||||
+; CHECK: srwi
|
||||
+; CHECK: sthbrx
|
||||
+; CHECK-NOT: stwbrx
|
||||
+}
|
||||
+
|
||||
+declare i32 @llvm.bswap.i32(i32)
|
||||
--
|
||||
1.8.3.1
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
From 88e57f376eabc375cd9f374369cf9e8e4dcb90af Mon Sep 17 00:00:00 2001
|
||||
From: Nemanja Ivanovic <nemanja.i.ibm@gmail.com>
|
||||
Date: Mon, 6 Mar 2017 07:32:13 +0000
|
||||
Subject: [PATCH 2/3] [PowerPC] Fix failure with STBRX when store is narrower
|
||||
than the bswap
|
||||
|
||||
Fixes a crash caused by r296811 by truncating the input of the STBRX node
|
||||
when the bswap is wider than i32.
|
||||
|
||||
Fixes https://bugs.llvm.org/show_bug.cgi?id=32140
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D30615
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297001 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
lib/Target/PowerPC/PPCISelLowering.cpp | 7 ++--
|
||||
test/CodeGen/PowerPC/pr32140.ll | 59 ++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 64 insertions(+), 2 deletions(-)
|
||||
create mode 100644 test/CodeGen/PowerPC/pr32140.ll
|
||||
|
||||
diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
index c8eb6f1..521bb32 100644
|
||||
--- a/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
+++ b/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
@@ -11230,9 +11230,12 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
// it need to be shifted to the right side before STBRX.
|
||||
EVT mVT = cast<StoreSDNode>(N)->getMemoryVT();
|
||||
if (Op1VT.bitsGT(mVT)) {
|
||||
- int shift = Op1VT.getSizeInBits() - mVT.getSizeInBits();
|
||||
+ int Shift = Op1VT.getSizeInBits() - mVT.getSizeInBits();
|
||||
BSwapOp = DAG.getNode(ISD::SRL, dl, Op1VT, BSwapOp,
|
||||
- DAG.getConstant(shift, dl, MVT::i32));
|
||||
+ DAG.getConstant(Shift, dl, MVT::i32));
|
||||
+ // Need to truncate if this is a bswap of i64 stored as i32/i16.
|
||||
+ if (Op1VT == MVT::i64)
|
||||
+ BSwapOp = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, BSwapOp);
|
||||
}
|
||||
|
||||
SDValue Ops[] = {
|
||||
diff --git a/test/CodeGen/PowerPC/pr32140.ll b/test/CodeGen/PowerPC/pr32140.ll
|
||||
new file mode 100644
|
||||
index 0000000..827a904
|
||||
--- /dev/null
|
||||
+++ b/test/CodeGen/PowerPC/pr32140.ll
|
||||
@@ -0,0 +1,59 @@
|
||||
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
+; RUN: llc -mtriple=powerpc64le-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
|
||||
+; RUN: llc -mtriple=powerpc64-linux-gnu -mcpu=pwr8 < %s | FileCheck %s
|
||||
+
|
||||
+@as = common local_unnamed_addr global i16 0, align 2
|
||||
+@bs = common local_unnamed_addr global i16 0, align 2
|
||||
+@ai = common local_unnamed_addr global i32 0, align 4
|
||||
+@bi = common local_unnamed_addr global i32 0, align 4
|
||||
+
|
||||
+define void @bswapStorei64Toi32() {
|
||||
+; CHECK-LABEL: bswapStorei64Toi32:
|
||||
+; CHECK: # BB#0: # %entry
|
||||
+; CHECK: lwa 3, 0(3)
|
||||
+; CHECK-NEXT: rldicl 3, 3, 32, 32
|
||||
+; CHECK-NEXT: stwbrx 3, 0, 4
|
||||
+; CHECK-NEXT: blr
|
||||
+entry:
|
||||
+ %0 = load i32, i32* @ai, align 4
|
||||
+ %conv.i = sext i32 %0 to i64
|
||||
+ %or26.i = tail call i64 @llvm.bswap.i64(i64 %conv.i)
|
||||
+ %conv = trunc i64 %or26.i to i32
|
||||
+ store i32 %conv, i32* @bi, align 4
|
||||
+ ret void
|
||||
+}
|
||||
+
|
||||
+define void @bswapStorei32Toi16() {
|
||||
+; CHECK-LABEL: bswapStorei32Toi16:
|
||||
+; CHECK: # BB#0: # %entry
|
||||
+; CHECK: lha 3, 0(3)
|
||||
+; CHECK-NEXT: srwi 3, 3, 16
|
||||
+; CHECK-NEXT: sthbrx 3, 0, 4
|
||||
+; CHECK-NEXT: blr
|
||||
+entry:
|
||||
+ %0 = load i16, i16* @as, align 2
|
||||
+ %conv.i = sext i16 %0 to i32
|
||||
+ %or26.i = tail call i32 @llvm.bswap.i32(i32 %conv.i)
|
||||
+ %conv = trunc i32 %or26.i to i16
|
||||
+ store i16 %conv, i16* @bs, align 2
|
||||
+ ret void
|
||||
+}
|
||||
+
|
||||
+define void @bswapStorei64Toi16() {
|
||||
+; CHECK-LABEL: bswapStorei64Toi16:
|
||||
+; CHECK: # BB#0: # %entry
|
||||
+; CHECK: lha 3, 0(3)
|
||||
+; CHECK-NEXT: rldicl 3, 3, 16, 48
|
||||
+; CHECK-NEXT: sthbrx 3, 0, 4
|
||||
+; CHECK-NEXT: blr
|
||||
+entry:
|
||||
+ %0 = load i16, i16* @as, align 2
|
||||
+ %conv.i = sext i16 %0 to i64
|
||||
+ %or26.i = tail call i64 @llvm.bswap.i64(i64 %conv.i)
|
||||
+ %conv = trunc i64 %or26.i to i16
|
||||
+ store i16 %conv, i16* @bs, align 2
|
||||
+ ret void
|
||||
+}
|
||||
+
|
||||
+declare i32 @llvm.bswap.i32(i32)
|
||||
+declare i64 @llvm.bswap.i64(i64)
|
||||
--
|
||||
1.8.3.1
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
From 8578ad1fb9aa7ebc7e6da266371b8fd58e67633f Mon Sep 17 00:00:00 2001
|
||||
From: Guozhi Wei <carrot@google.com>
|
||||
Date: Thu, 15 Mar 2018 17:49:12 +0000
|
||||
Subject: [PATCH 3/3] [PPC] Avoid non-simple MVT in STBRX optimization
|
||||
|
||||
PR35402 triggered this case. It bswap and stores a 48bit value, current STBRX optimization transforms it into STBRX. Unfortunately 48bit is not a simple MVT, there is no PPC instruction to support it, and it can't be automatically expanded by llvm, so caused a crash.
|
||||
|
||||
This patch detects the non-simple MVT and returns early.
|
||||
|
||||
Differential Revision: https://reviews.llvm.org/D44500
|
||||
|
||||
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327651 91177308-0d34-0410-b5e6-96231b3b80d8
|
||||
---
|
||||
lib/Target/PowerPC/PPCISelLowering.cpp | 6 +++++-
|
||||
test/CodeGen/PowerPC/pr35402.ll | 18 ++++++++++++++++++
|
||||
2 files changed, 23 insertions(+), 1 deletion(-)
|
||||
create mode 100644 test/CodeGen/PowerPC/pr35402.ll
|
||||
|
||||
diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
index 521bb32..3c37306 100644
|
||||
--- a/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
+++ b/lib/Target/PowerPC/PPCISelLowering.cpp
|
||||
@@ -11221,6 +11221,11 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
N->getOperand(1).getValueType() == MVT::i16 ||
|
||||
(Subtarget.hasLDBRX() && Subtarget.isPPC64() &&
|
||||
N->getOperand(1).getValueType() == MVT::i64))) {
|
||||
+ // STBRX can only handle simple types.
|
||||
+ EVT mVT = cast<StoreSDNode>(N)->getMemoryVT();
|
||||
+ if (mVT.isExtended())
|
||||
+ break;
|
||||
+
|
||||
SDValue BSwapOp = N->getOperand(1).getOperand(0);
|
||||
// Do an any-extend to 32-bits if this is a half-word input.
|
||||
if (BSwapOp.getValueType() == MVT::i16)
|
||||
@@ -11228,7 +11233,6 @@ SDValue PPCTargetLowering::PerformDAGCombine(SDNode *N,
|
||||
|
||||
// If the type of BSWAP operand is wider than stored memory width
|
||||
// it need to be shifted to the right side before STBRX.
|
||||
- EVT mVT = cast<StoreSDNode>(N)->getMemoryVT();
|
||||
if (Op1VT.bitsGT(mVT)) {
|
||||
int Shift = Op1VT.getSizeInBits() - mVT.getSizeInBits();
|
||||
BSwapOp = DAG.getNode(ISD::SRL, dl, Op1VT, BSwapOp,
|
||||
diff --git a/test/CodeGen/PowerPC/pr35402.ll b/test/CodeGen/PowerPC/pr35402.ll
|
||||
new file mode 100644
|
||||
index 0000000..06e6d96
|
||||
--- /dev/null
|
||||
+++ b/test/CodeGen/PowerPC/pr35402.ll
|
||||
@@ -0,0 +1,18 @@
|
||||
+; RUN: llc -O2 < %s | FileCheck %s
|
||||
+target triple = "powerpc64le-linux-gnu"
|
||||
+
|
||||
+define void @test(i8* %p, i64 %data) {
|
||||
+entry:
|
||||
+ %0 = tail call i64 @llvm.bswap.i64(i64 %data)
|
||||
+ %ptr = bitcast i8* %p to i48*
|
||||
+ %val = trunc i64 %0 to i48
|
||||
+ store i48 %val, i48* %ptr, align 1
|
||||
+ ret void
|
||||
+
|
||||
+; CHECK: sth
|
||||
+; CHECK: stw
|
||||
+; CHECK-NOT: stdbrx
|
||||
+
|
||||
+}
|
||||
+
|
||||
+declare i64 @llvm.bswap.i64(i64)
|
||||
--
|
||||
1.8.3.1
|
||||
|
14
llvm.spec
14
llvm.spec
|
@ -1,4 +1,4 @@
|
|||
# Components enabled if supported by target architecture:
|
||||
# Components enabled if supported by target architecture:
|
||||
%ifarch %ix86 x86_64
|
||||
%bcond_without gold
|
||||
%else
|
||||
|
@ -9,7 +9,7 @@
|
|||
|
||||
Name: llvm
|
||||
Version: 4.0.1
|
||||
Release: 1%{?dist}
|
||||
Release: 3%{?dist}
|
||||
Summary: The Low Level Virtual Machine
|
||||
|
||||
License: NCSA
|
||||
|
@ -23,6 +23,10 @@ Patch3: 0001-CMake-Split-static-library-exports-into-their-own-ex.patch
|
|||
Patch4: 0001-Revert-Revert-CMake-Move-sphinx-detection-into-AddSp.patch
|
||||
Patch5: 0001-CMake-Fix-docs-llvm-man-target-when-clang-llvm-is-in.patch
|
||||
Patch6: 0001-CMake-Add-LLVM_UTILS_INSTALL_DIR-option.patch
|
||||
Patch7: 0001-DebugInfo-Fix-potential-CU-mismatch-for-SubprogramSc.patch
|
||||
Patch8: 0001-PPC-Fix-code-generation-for-bswap-int32-followed-by-.patch
|
||||
Patch9: 0002-PowerPC-Fix-failure-with-STBRX-when-store-is-narrowe.patch
|
||||
Patch10: 0003-PPC-Avoid-non-simple-MVT-in-STBRX-optimization.patch
|
||||
|
||||
BuildRequires: cmake
|
||||
BuildRequires: zlib-devel
|
||||
|
@ -204,6 +208,12 @@ fi
|
|||
%{_libdir}/cmake/llvm/LLVMStaticExports.cmake
|
||||
|
||||
%changelog
|
||||
* Mon Mar 19 2018 Tom Stellard <tstellar@redhat.com> - 4.0.1-3
|
||||
- Backport r296811, r297001, and r327651 from trunk. rhbz#1554349
|
||||
|
||||
* Tue Nov 21 2017 Tom Stellard <tstellar@redhat.com> - 4.0.1-2
|
||||
- Backport r318289 to fix a debuginfo issue with rust.
|
||||
|
||||
* Wed Jun 21 2017 Tom Stellard <tstellar@redhat.com> - 4.0.1-1
|
||||
- 4.0.1 Release
|
||||
|
||||
|
|
1
sources
1
sources
|
@ -1,2 +1 @@
|
|||
SHA512 (llvm-4.0.0.src.tar.xz) = cf681f0626ef6d568d951cdc3e143471a1d7715a0ba11e52aa273cf5d8d421e1357ef2645cc85879eaefcd577e99e74d07b01566825b3d0461171ef2cbfc7704
|
||||
SHA512 (llvm-4.0.1.src.tar.xz) = 16adc39b34ddb628f81b171119a8e2a0e9138b25011e803ef0b688e2fbea116fc4953d3a1b61b90a98a75e33619f81566b7cb06a9a2ea4d04ac5e0eb303a2d1d
|
||||
|
|
Loading…
Reference in New Issue