]> granicus.if.org Git - llvm/commitdiff
[JITLink] Improve/fix some JITLink debugging output.
authorLang Hames <lhames@gmail.com>
Thu, 9 May 2019 22:03:57 +0000 (22:03 +0000)
committerLang Hames <lhames@gmail.com>
Thu, 9 May 2019 22:03:57 +0000 (22:03 +0000)
Adds full edge details (rather than just edge targets) when out-of-range errors
are generated. Also fixes a bug where debugging output accessed an invalidated
DenseMap iterator by moving the debugging output above the invalidation point.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360383 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/JITLink/MachOAtomGraphBuilder.cpp
lib/ExecutionEngine/JITLink/MachO_x86_64.cpp

index 5feff393ebd5e457c63d704494dfcf870b9568b2..215742c0e52eec0c39336ad50b14b29265de3235 100644 (file)
@@ -338,21 +338,21 @@ Error MachOAtomGraphBuilder::addNonCustomAtoms() {
     auto AltEntryStartItr = AltEntryStarts.find(&*AltEntryPred);
     if (AltEntryStartItr != AltEntryStarts.end()) {
       // If the predecessor was an alt-entry atom then re-use its value.
-      AltEntryStarts[DA] = AltEntryStartItr->second;
       LLVM_DEBUG({
         dbgs() << "  " << *DA << " -> " << *AltEntryStartItr->second
                << " (based on existing entry for " << *AltEntryPred << ")\n";
       });
+      AltEntryStarts[DA] = AltEntryStartItr->second;
     } else {
       // If the predecessor does not have an entry then add an entry for this
       // atom (i.e. the alt_entry atom) and a self-reference entry for the
       /// predecessory atom that is the start of this chain.
-      AltEntryStarts[&*AltEntryPred] = &*AltEntryPred;
-      AltEntryStarts[DA] = &*AltEntryPred;
       LLVM_DEBUG({
         dbgs() << "  " << *AltEntryPred << " -> " << *AltEntryPred << "\n"
                << "  " << *DA << " -> " << *AltEntryPred << "\n";
       });
+      AltEntryStarts[&*AltEntryPred] = &*AltEntryPred;
+      AltEntryStarts[DA] = &*AltEntryPred;
     }
   }
 
index d9472e40ead4fac91499eb667eb3cb1c6acdd879..2f0eaf206e961520363dd5b3fd3c279862015a6d 100644 (file)
@@ -448,11 +448,13 @@ private:
     return MachOAtomGraphBuilder_x86_64(**MachOObj).buildGraph();
   }
 
-  static Error targetOutOfRangeError(const Edge &E) {
+  static Error targetOutOfRangeError(const Atom &A, const Edge &E) {
     std::string ErrMsg;
     {
       raw_string_ostream ErrStream(ErrMsg);
-      ErrStream << "Target \"" << E.getTarget() << "\" out of range";
+      ErrStream << "Relocation target out of range: ";
+      printEdge(ErrStream, A, E, getMachOX86RelocationKindName(E.getKind()));
+      ErrStream << "\n";
     }
     return make_error<JITLinkError>(std::move(ErrMsg));
   }
@@ -471,7 +473,7 @@ private:
           E.getTarget().getAddress() - (FixupAddress + 4) + E.getAddend();
       if (Value < std::numeric_limits<int32_t>::min() ||
           Value > std::numeric_limits<int32_t>::max())
-        return targetOutOfRangeError(E);
+        return targetOutOfRangeError(A, E);
       *(little32_t *)FixupPtr = Value;
       break;
     }
@@ -489,7 +491,7 @@ private:
           E.getTarget().getAddress() - (FixupAddress + Delta) + E.getAddend();
       if (Value < std::numeric_limits<int32_t>::min() ||
           Value > std::numeric_limits<int32_t>::max())
-        return targetOutOfRangeError(E);
+        return targetOutOfRangeError(A, E);
       *(little32_t *)FixupPtr = Value;
       break;
     }
@@ -501,7 +503,7 @@ private:
           E.getTarget().getAddress() - (FixupAddress + Delta) + E.getAddend();
       if (Value < std::numeric_limits<int32_t>::min() ||
           Value > std::numeric_limits<int32_t>::max())
-        return targetOutOfRangeError(E);
+        return targetOutOfRangeError(A, E);
       *(little32_t *)FixupPtr = Value;
       break;
     }
@@ -518,7 +520,7 @@ private:
       if (E.getKind() == Delta32 || E.getKind() == NegDelta32) {
         if (Value < std::numeric_limits<int32_t>::min() ||
             Value > std::numeric_limits<int32_t>::max())
-          return targetOutOfRangeError(E);
+          return targetOutOfRangeError(A, E);
         *(little32_t *)FixupPtr = Value;
       } else
         *(little64_t *)FixupPtr = Value;