From 34b1ea9c1925d0da9377973d25e10e9b5ec40e94 Mon Sep 17 00:00:00 2001
From: Alexandre Bouvier <contact@amb.tf>
Date: Mon, 23 Jan 2023 01:51:12 +0100
Subject: [PATCH] cmake: prefer system llvm library

---
 CMakeLists.txt                                   |  1 +
 CMakeModules/FindLLVM.cmake                      | 16 ++++++++++++++++
 externals/CMakeLists.txt                         |  9 ++++++---
 externals/demangle/ItaniumDemangle.cpp           |  4 ++--
 .../demangle/{ => llvm/Demangle}/Demangle.h      |  0
 .../{ => llvm/Demangle}/DemangleConfig.h         |  0
 .../{ => llvm/Demangle}/ItaniumDemangle.h        |  0
 .../demangle/{ => llvm/Demangle}/StringView.h    |  0
 externals/demangle/{ => llvm/Demangle}/Utility.h |  0
 src/common/CMakeLists.txt                        |  2 +-
 src/common/demangle.cpp                          |  6 ++----
 11 files changed, 28 insertions(+), 10 deletions(-)
 create mode 100644 CMakeModules/FindLLVM.cmake
 rename externals/demangle/{ => llvm/Demangle}/Demangle.h (100%)
 rename externals/demangle/{ => llvm/Demangle}/DemangleConfig.h (100%)
 rename externals/demangle/{ => llvm/Demangle}/ItaniumDemangle.h (100%)
 rename externals/demangle/{ => llvm/Demangle}/StringView.h (100%)
 rename externals/demangle/{ => llvm/Demangle}/Utility.h (100%)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f91ba950a..b3329318a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -208,6 +208,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
 find_package(enet 1.3 MODULE)
 find_package(fmt 9 REQUIRED)
 find_package(inih MODULE)
+find_package(LLVM MODULE)
 find_package(lz4 REQUIRED)
 find_package(nlohmann_json 3.8 REQUIRED)
 find_package(Opus 1.3 MODULE)
diff --git a/CMakeModules/FindLLVM.cmake b/CMakeModules/FindLLVM.cmake
new file mode 100644
index 000000000..513d9a536
--- /dev/null
+++ b/CMakeModules/FindLLVM.cmake
@@ -0,0 +1,16 @@
+# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+find_package(LLVM QUIET CONFIG)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(LLVM CONFIG_MODE)
+
+if (LLVM_FOUND AND NOT TARGET LLVM::Demangle)
+    add_library(LLVM::Demangle INTERFACE IMPORTED)
+    llvm_map_components_to_libnames(LLVM_LIBRARIES demangle)
+    target_compile_definitions(LLVM::Demangle INTERFACE ${LLVM_DEFINITIONS})
+    target_include_directories(LLVM::Demangle INTERFACE ${LLVM_INCLUDE_DIRS})
+    target_link_libraries(LLVM::Demangle INTERFACE ${LLVM_LIBRARIES})
+endif()
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 94dd8bb62..8532fd7a8 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -158,6 +158,9 @@ if (YUZU_USE_EXTERNAL_VULKAN_HEADERS)
     add_subdirectory(Vulkan-Headers EXCLUDE_FROM_ALL)
 endif()
 
-add_library(demangle STATIC)
-target_include_directories(demangle PUBLIC ./demangle)
-target_sources(demangle PRIVATE demangle/ItaniumDemangle.cpp)
+if (NOT TARGET LLVM::Demangle)
+    add_library(demangle STATIC)
+    target_include_directories(demangle PUBLIC ./demangle)
+    target_sources(demangle PRIVATE demangle/ItaniumDemangle.cpp)
+    add_library(LLVM::Demangle ALIAS demangle)
+endif()
diff --git a/externals/demangle/ItaniumDemangle.cpp b/externals/demangle/ItaniumDemangle.cpp
index 5e078e3e2..b055a2fd7 100644
--- a/externals/demangle/ItaniumDemangle.cpp
+++ b/externals/demangle/ItaniumDemangle.cpp
@@ -11,8 +11,8 @@
 // file does not yet support:
 //   - C++ modules TS
 
-#include "Demangle.h"
-#include "ItaniumDemangle.h"
+#include "llvm/Demangle/Demangle.h"
+#include "llvm/Demangle/ItaniumDemangle.h"
 
 #include <cassert>
 #include <cctype>
diff --git a/externals/demangle/Demangle.h b/externals/demangle/llvm/Demangle/Demangle.h
similarity index 100%
rename from externals/demangle/Demangle.h
rename to externals/demangle/llvm/Demangle/Demangle.h
diff --git a/externals/demangle/DemangleConfig.h b/externals/demangle/llvm/Demangle/DemangleConfig.h
similarity index 100%
rename from externals/demangle/DemangleConfig.h
rename to externals/demangle/llvm/Demangle/DemangleConfig.h
diff --git a/externals/demangle/ItaniumDemangle.h b/externals/demangle/llvm/Demangle/ItaniumDemangle.h
similarity index 100%
rename from externals/demangle/ItaniumDemangle.h
rename to externals/demangle/llvm/Demangle/ItaniumDemangle.h
diff --git a/externals/demangle/StringView.h b/externals/demangle/llvm/Demangle/StringView.h
similarity index 100%
rename from externals/demangle/StringView.h
rename to externals/demangle/llvm/Demangle/StringView.h
diff --git a/externals/demangle/Utility.h b/externals/demangle/llvm/Demangle/Utility.h
similarity index 100%
rename from externals/demangle/Utility.h
rename to externals/demangle/llvm/Demangle/Utility.h
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index bd6ac6716..9884a4a0b 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -177,7 +177,7 @@ endif()
 create_target_directory_groups(common)
 
 target_link_libraries(common PUBLIC ${Boost_LIBRARIES} fmt::fmt microprofile Threads::Threads)
-target_link_libraries(common PRIVATE lz4::lz4 zstd::zstd demangle)
+target_link_libraries(common PRIVATE lz4::lz4 zstd::zstd LLVM::Demangle)
 
 if (YUZU_USE_PRECOMPILED_HEADERS)
     target_precompile_headers(common PRIVATE precompiled_headers.h)
diff --git a/src/common/demangle.cpp b/src/common/demangle.cpp
index f4246f666..3310faf86 100644
--- a/src/common/demangle.cpp
+++ b/src/common/demangle.cpp
@@ -1,13 +1,11 @@
 // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
 // SPDX-License-Identifier: GPL-2.0-or-later
 
+#include <llvm/Demangle/Demangle.h>
+
 #include "common/demangle.h"
 #include "common/scope_exit.h"
 
-namespace llvm {
-char* itaniumDemangle(const char* mangled_name, char* buf, size_t* n, int* status);
-}
-
 namespace Common {
 
 std::string DemangleSymbol(const std::string& mangled) {