[PATCH] D135359: [lld-macho] Don't fold DWARFs with CompactUnwinds
Vy Nguyen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 14 10:21:30 PDT 2022
oontvoo updated this revision to Diff 467824.
oontvoo marked 2 inline comments as done.
oontvoo added a comment.
updated diff per review
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D135359/new/
https://reviews.llvm.org/D135359
Files:
lld/MachO/InputFiles.cpp
lld/MachO/Target.h
lld/MachO/UnwindInfoSection.cpp
Index: lld/MachO/UnwindInfoSection.cpp
===================================================================
--- lld/MachO/UnwindInfoSection.cpp
+++ lld/MachO/UnwindInfoSection.cpp
@@ -393,10 +393,9 @@
// of the unwind info's unwind address, two functions that have identical
// unwind info can't be folded if it's using this encoding since both
// entries need unique addresses.
- static_assert(static_cast<uint32_t>(UNWIND_X86_64_MODE_MASK) ==
- static_cast<uint32_t>(UNWIND_X86_MODE_MASK));
static_assert(static_cast<uint32_t>(UNWIND_X86_64_MODE_STACK_IND) ==
static_cast<uint32_t>(UNWIND_X86_MODE_STACK_IND));
+
if ((target->cpuType == CPU_TYPE_X86_64 || target->cpuType == CPU_TYPE_X86) &&
(encoding & UNWIND_X86_64_MODE_MASK) == UNWIND_X86_64_MODE_STACK_IND) {
// FIXME: Consider passing in the two function addresses and getting
Index: lld/MachO/Target.h
===================================================================
--- lld/MachO/Target.h
+++ lld/MachO/Target.h
@@ -20,6 +20,8 @@
#include <cstddef>
#include <cstdint>
+#include "mach-o/compact_unwind_encoding.h"
+
namespace lld::macho {
LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
@@ -29,6 +31,15 @@
class InputSection;
class ObjFile;
+static_assert(static_cast<uint32_t>(UNWIND_X86_64_MODE_MASK) ==
+ static_cast<uint32_t>(UNWIND_X86_MODE_MASK) &&
+ static_cast<uint32_t>(UNWIND_ARM64_MODE_MASK) ==
+ static_cast<uint32_t>(UNWIND_X86_64_MODE_MASK));
+
+// Since the mode masks have the same value on all targets, define
+// a common one for convenience.
+constexpr uint32_t UNWIND_MODE_MASK = UNWIND_X86_64_MODE_MASK;
+
class TargetInfo {
public:
template <class LP> TargetInfo(LP) {
Index: lld/MachO/InputFiles.cpp
===================================================================
--- lld/MachO/InputFiles.cpp
+++ lld/MachO/InputFiles.cpp
@@ -73,6 +73,8 @@
#include "llvm/TextAPI/Architecture.h"
#include "llvm/TextAPI/InterfaceFile.h"
+#include "mach-o/compact_unwind_encoding.h"
+
#include <type_traits>
using namespace llvm;
@@ -1069,6 +1071,11 @@
// Create pointers from symbols to their associated compact unwind entries.
void ObjFile::registerCompactUnwind(Section &compactUnwindSection) {
+ static_assert(static_cast<uint32_t>(UNWIND_X86_64_MODE_MASK) ==
+ static_cast<uint32_t>(UNWIND_X86_MODE_MASK) &&
+ static_cast<uint32_t>(UNWIND_ARM64_MODE_MASK) ==
+ static_cast<uint32_t>(UNWIND_X86_64_MODE_MASK));
+
for (const Subsection &subsection : compactUnwindSection.subsections) {
ConcatInputSection *isec = cast<ConcatInputSection>(subsection.isec);
// Hack!! Each compact unwind entry (CUE) has its UNSIGNED relocations embed
@@ -1096,7 +1103,8 @@
// llvm-mc omits CU entries for functions that need DWARF encoding, but
// `ld -r` doesn't. We can ignore them because we will re-synthesize these
// CU entries from the DWARF info during the output phase.
- if ((encoding & target->modeDwarfEncoding) == target->modeDwarfEncoding)
+ if ((encoding & static_cast<uint32_t>(UNWIND_MODE_MASK)) ==
+ target->modeDwarfEncoding)
continue;
ConcatInputSection *referentIsec;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D135359.467824.patch
Type: text/x-patch
Size: 3282 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221014/64e1af53/attachment.bin>
More information about the llvm-commits
mailing list