File: llvm_DIAssignIDs.patch

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (104 lines) | stat: -rw-r--r-- 4,862 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Description: Patch from upstream to fix clang crash.
Origin: upstream, https://github.com/swiftlang/llvm-project/commit/91d7ca904
Bug: https://github.com/swiftlang/llvm-project/issues/8741
Forwarded: not-needed
Applied-Upstream: 6.1

--- swiftlang-6.0.3.orig/llvm-project/llvm/include/llvm/IR/DebugInfo.h
+++ swiftlang-6.0.3/llvm-project/llvm/include/llvm/IR/DebugInfo.h
@@ -238,6 +238,10 @@ bool calculateFragmentIntersect(
     uint64_t SliceSizeInBits, const DbgAssignIntrinsic *DAI,
     std::optional<DIExpression::FragmentInfo> &Result);
 
+/// Replace DIAssignID uses and attachments with IDs from \p Map.
+/// If an ID is unmapped a new ID is generated and added to \p Map.
+void remapAssignID(DenseMap<DIAssignID *, DIAssignID *> &Map, Instruction &I);
+
 /// Helper struct for trackAssignments, below. We don't use the similar
 /// DebugVariable class because trackAssignments doesn't (yet?) understand
 /// partial variables (fragment info) as input and want to make that clear and
--- swiftlang-6.0.3.orig/llvm-project/llvm/lib/IR/DebugInfo.cpp
+++ swiftlang-6.0.3/llvm-project/llvm/lib/IR/DebugInfo.cpp
@@ -1913,6 +1913,30 @@ bool at::calculateFragmentIntersect(
   return true;
 }
 
+/// Update inlined instructions' DIAssignID metadata. We need to do this
+/// otherwise a function inlined more than once into the same function
+/// will cause DIAssignID to be shared by many instructions.
+void at::remapAssignID(DenseMap<DIAssignID *, DIAssignID *> &Map,
+                       Instruction &I) {
+  auto GetNewID = [&Map](Metadata *Old) {
+    DIAssignID *OldID = cast<DIAssignID>(Old);
+    if (DIAssignID *NewID = Map.lookup(OldID))
+      return NewID;
+    DIAssignID *NewID = DIAssignID::getDistinct(OldID->getContext());
+    Map[OldID] = NewID;
+    return NewID;
+  };
+  // If we find a DIAssignID attachment or use, replace it with a new version.
+  //for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
+  //  if (DVR.isDbgAssign())
+  //    DVR.setAssignId(GetNewID(DVR.getAssignID()));
+  //}
+  if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
+    I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
+  else if (auto *DAI = dyn_cast<DbgAssignIntrinsic>(&I))
+    DAI->setAssignId(GetNewID(DAI->getAssignID()));
+}
+
 /// Collect constant properies (base, size, offset) of \p StoreDest.
 /// Return std::nullopt if any properties are not constants or the
 /// offset from the base pointer is negative.
--- swiftlang-6.0.3.orig/llvm-project/llvm/lib/Transforms/Utils/CodeExtractor.cpp
+++ swiftlang-6.0.3/llvm-project/llvm/lib/Transforms/Utils/CodeExtractor.cpp
@@ -1605,8 +1605,9 @@ static void fixupDebugInfoPostExtraction
     DII->eraseFromParent();
   DIB.finalizeSubprogram(NewSP);
 
-  // Fix up the scope information attached to the line locations in the new
-  // function.
+  // Fix up the scope information attached to the line locations and the
+  // debug assignment metadata in the new function.
+  DenseMap<DIAssignID *, DIAssignID *> AssignmentIDMap;
   for (Instruction &I : instructions(NewFunc)) {
     if (const DebugLoc &DL = I.getDebugLoc())
       I.setDebugLoc(
@@ -1619,6 +1620,7 @@ static void fixupDebugInfoPostExtraction
       return MD;
     };
     updateLoopMetadataDebugLocations(I, updateLoopInfoLoc);
+    at::remapAssignID(AssignmentIDMap, I);
     if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
       I.setMetadata(LLVMContext::MD_DIAssignID, nullptr);
   }
--- swiftlang-6.0.3.orig/llvm-project/llvm/lib/Transforms/Utils/InlineFunction.cpp
+++ swiftlang-6.0.3/llvm-project/llvm/lib/Transforms/Utils/InlineFunction.cpp
@@ -1719,25 +1719,12 @@ static void trackInlinedStores(Function:
 /// otherwise a function inlined more than once into the same function
 /// will cause DIAssignID to be shared by many instructions.
 static void fixupAssignments(Function::iterator Start, Function::iterator End) {
-  // Map {Old, New} metadata. Not used directly - use GetNewID.
   DenseMap<DIAssignID *, DIAssignID *> Map;
-  auto GetNewID = [&Map](Metadata *Old) {
-    DIAssignID *OldID = cast<DIAssignID>(Old);
-    if (DIAssignID *NewID = Map.lookup(OldID))
-      return NewID;
-    DIAssignID *NewID = DIAssignID::getDistinct(OldID->getContext());
-    Map[OldID] = NewID;
-    return NewID;
-  };
   // Loop over all the inlined instructions. If we find a DIAssignID
   // attachment or use, replace it with a new version.
   for (auto BBI = Start; BBI != End; ++BBI) {
-    for (Instruction &I : *BBI) {
-      if (auto *ID = I.getMetadata(LLVMContext::MD_DIAssignID))
-        I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID));
-      else if (auto *DAI = dyn_cast<DbgAssignIntrinsic>(&I))
-        DAI->setAssignId(GetNewID(DAI->getAssignID()));
-    }
+    for (Instruction &I : *BBI)
+      at::remapAssignID(Map, I);
   }
 }
 #undef DEBUG_TYPE