[llvm] r209607 - tools: avoid use of std::function

Saleem Abdulrasool compnerd at compnerd.org
Sun May 25 14:37:59 PDT 2014


Author: compnerd
Date: Sun May 25 16:37:59 2014
New Revision: 209607

URL: http://llvm.org/viewvc/llvm-project?rev=209607&view=rev
Log:
tools: avoid use of std::function

Remove the use of the std::function and replace the capturing lambda with a
non-capturing one, opting to pass the user data down to the context.  This is
needed as std::function is not yet available on all hosted platforms (it
requires RTTI, which breaks on Windows).

Thanks to Nico Rieck for pointing this out!

Modified:
    llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
    llvm/trunk/tools/llvm-readobj/Win64EHDumper.cpp
    llvm/trunk/tools/llvm-readobj/Win64EHDumper.h

Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=209607&r1=209606&r2=209607&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Sun May 25 16:37:59 2014
@@ -849,11 +849,12 @@ void COFFDumper::printUnwindInfo() {
   case COFF::IMAGE_FILE_MACHINE_AMD64: {
     Win64EH::Dumper Dumper(W);
     Win64EH::Dumper::SymbolResolver Resolver =
-      [this](const object::coff_section *Section, uint64_t Offset,
-             SymbolRef &Symbol) -> error_code {
-        return this->resolveSymbol(Section, Offset, Symbol);
+      [](const object::coff_section *Section, uint64_t Offset,
+         SymbolRef &Symbol, void *user_data) -> error_code {
+        COFFDumper *Dumper = reinterpret_cast<COFFDumper*>(user_data);
+        return Dumper->resolveSymbol(Section, Offset, Symbol);
       };
-    Win64EH::Dumper::Context Ctx(*Obj, Resolver);
+    Win64EH::Dumper::Context Ctx(*Obj, Resolver, this);
     Dumper.printData(Ctx);
     break;
   }

Modified: llvm/trunk/tools/llvm-readobj/Win64EHDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/Win64EHDumper.cpp?rev=209607&r1=209606&r2=209607&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/Win64EHDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/Win64EHDumper.cpp Sun May 25 16:37:59 2014
@@ -120,7 +120,8 @@ static std::string formatSymbol(const Du
 
   StringRef Name;
   SymbolRef Symbol;
-  if (Ctx.ResolveSymbol(Section, Offset, Symbol) || Symbol.getName(Name)) {
+  if (Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData) ||
+      Symbol.getName(Name)) {
     OS << format(" (0x%" PRIX64 ")", Offset);
     return OS.str();
   }
@@ -139,7 +140,7 @@ static error_code resolveRelocation(cons
                                     const coff_section *&ResolvedSection,
                                     uint64_t &ResolvedAddress) {
   SymbolRef Symbol;
-  if (error_code EC = Ctx.ResolveSymbol(Section, Offset, Symbol))
+  if (error_code EC = Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData))
     return EC;
 
   if (error_code EC = Symbol.getAddress(ResolvedAddress))

Modified: llvm/trunk/tools/llvm-readobj/Win64EHDumper.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/Win64EHDumper.h?rev=209607&r1=209606&r2=209607&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/Win64EHDumper.h (original)
+++ llvm/trunk/tools/llvm-readobj/Win64EHDumper.h Sun May 25 16:37:59 2014
@@ -13,8 +13,6 @@
 #include "StreamWriter.h"
 #include "llvm/Support/Win64EH.h"
 
-#include <functional>
-
 namespace llvm {
 namespace object {
 class COFFObjectFile;
@@ -28,15 +26,17 @@ class Dumper {
   raw_ostream &OS;
 
 public:
-  typedef std::function<error_code(const object::coff_section *, uint64_t,
-                                   object::SymbolRef &)> SymbolResolver;
+  typedef error_code (*SymbolResolver)(const object::coff_section *, uint64_t,
+                                       object::SymbolRef &, void *);
 
   struct Context {
     const object::COFFObjectFile &COFF;
     SymbolResolver ResolveSymbol;
+    void *UserData;
 
-    Context(const object::COFFObjectFile &COFF, SymbolResolver Resolver)
-      : COFF(COFF), ResolveSymbol(Resolver) {}
+    Context(const object::COFFObjectFile &COFF, SymbolResolver Resolver,
+            void *UserData)
+      : COFF(COFF), ResolveSymbol(Resolver), UserData(UserData) {}
   };
 
 private:





More information about the llvm-commits mailing list