[llvm] r212777 - [RuntimeDyld] Improve error diagnostic in RuntimeDyldChecker.

Lang Hames lhames at gmail.com
Thu Jul 10 16:26:20 PDT 2014


Author: lhames
Date: Thu Jul 10 18:26:20 2014
New Revision: 212777

URL: http://llvm.org/viewvc/llvm-project?rev=212777&view=rev
Log:
[RuntimeDyld] Improve error diagnostic in RuntimeDyldChecker.

The compiler often emits assembler-local labels (beginning with 'L') for use in
relocation expressions, however these aren't included in the object files.
Teach RuntimeDyldChecker to warn the user if they try to use one of these in an
expression, since it will never work.


Modified:
    llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp

Modified: llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h?rev=212777&r1=212776&r2=212777&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/RuntimeDyldChecker.h Thu Jul 10 18:26:20 2014
@@ -81,7 +81,7 @@ public:
 
 private:
 
-  bool checkSymbolIsValidForLoad(StringRef Symbol) const;
+  bool isSymbolValid(StringRef Symbol) const;
   uint64_t getSymbolAddress(StringRef Symbol) const;
   uint64_t readMemoryAtSymbol(StringRef Symbol, int64_t Offset,
                               unsigned Size) const;

Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp?rev=212777&r1=212776&r2=212777&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldChecker.cpp Thu Jul 10 18:26:20 2014
@@ -199,7 +199,7 @@ namespace llvm {
       StringRef Symbol;
       std::tie(Symbol, RemainingExpr) = parseSymbol(RemainingExpr);
 
-      if (!Checker.checkSymbolIsValidForLoad(Symbol))
+      if (!Checker.isSymbolValid(Symbol))
         return std::make_pair(EvalResult(("Cannot decode unknown symbol '" +
                                           Symbol + "'").str()),
                               "");
@@ -268,7 +268,7 @@ namespace llvm {
       StringRef Symbol;
       std::tie(Symbol, RemainingExpr) = parseSymbol(RemainingExpr);
 
-      if (!Checker.checkSymbolIsValidForLoad(Symbol))
+      if (!Checker.isSymbolValid(Symbol))
         return std::make_pair(EvalResult(("Cannot decode unknown symbol '"
                                           + Symbol + "'").str()),
                               "");
@@ -304,6 +304,17 @@ namespace llvm {
       else if (Symbol == "next_pc")
         return evalNextPC(RemainingExpr);
 
+      if (!Checker.isSymbolValid(Symbol)) {
+        std::string ErrMsg("No known address for symbol '");
+        ErrMsg += Symbol;
+        ErrMsg += "'";
+        if (Symbol.startswith("L"))
+          ErrMsg += " (this appears to be an assembler local label - "
+                    " perhaps drop the 'L'?)";
+
+        return std::make_pair(EvalResult(ErrMsg), "");
+      }
+
       // Looks like a plain symbol reference.
       return std::make_pair(EvalResult(Checker.getSymbolAddress(Symbol)),
                             RemainingExpr);
@@ -397,7 +408,7 @@ namespace llvm {
       StringRef Symbol;
       std::tie(Symbol, RemainingExpr) = parseSymbol(RemainingExpr);
 
-      if (!Checker.checkSymbolIsValidForLoad(Symbol))
+      if (!Checker.isSymbolValid(Symbol))
         return std::make_pair(EvalResult(("Cannot dereference unknown symbol '"
                                           + Symbol + "'").str()),
                               "");
@@ -612,7 +623,7 @@ bool RuntimeDyldChecker::checkAllRulesIn
   return DidAllTestsPass && (NumRules != 0);
 }
 
-bool RuntimeDyldChecker::checkSymbolIsValidForLoad(StringRef Symbol) const {
+bool RuntimeDyldChecker::isSymbolValid(StringRef Symbol) const {
   return RTDyld.getSymbolAddress(Symbol) != nullptr;
 }
 





More information about the llvm-commits mailing list