Merge master.
[dcpomatic.git] / src / lib / stack.cpp
index b3479b1bb174160fd9379420d116dd5a93da48d9..a8183d3444c7c426f47fcbcc3d60b70548039f47 100644 (file)
 #include <stdexcept>
 #include <sstream>
 
-#include "dbg/stack.hpp"
+#include "stack.hpp"
 
 #if defined(_WIN32)
 #   include <windows.h>
 #   include <imagehlp.h>
 
 #   if defined(__MINGW32__)
+#       define PACKAGE 1
+#       define PACKAGE_VERSION 1
 #       include <bfd.h> // link against libbfd and libiberty
 #       include <psapi.h> // link against psapi
 #       include <cxxabi.h>
@@ -77,6 +79,7 @@ namespace
             struct find_data
             {
                 std::string func;
+                unsigned int line;
                 asymbol **symbol_table;
                 bfd_vma counter;
             };
@@ -125,7 +128,7 @@ namespace
                 bfd_close(abfd_);
             }
 
-            std::string get_function_name(DWORD offset)
+            std::pair<std::string, unsigned int> get_function_name_and_line(DWORD offset)
             {
                 find_data data;
                 data.symbol_table = symbol_table_;
@@ -133,7 +136,7 @@ namespace
 
                 bfd_map_over_sections(abfd_, &find_function_name_in_section, &data);
 
-                return data.func;
+                return std::make_pair(data.func, data.line);
             }
 
         private:
@@ -154,8 +157,10 @@ namespace
                 const char *file = 0;
                 unsigned line = 0;
 
-                if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func)
+                if (bfd_find_nearest_line(abfd, sec, data.symbol_table, data.counter - vma, &file, &func, &line) && func) {
                     data.func = demangle(func);
+                    data.line = line;
+                }
             }
 
         private:
@@ -192,7 +197,7 @@ namespace
         public:
             explicit windows_dll(const std::string &libname) :
                 name_(libname),
-                lib_(LoadLibrary(name_.c_str()))
+                lib_(LoadLibraryA(name_.c_str()))
             {
                 if (!lib_) throw std::runtime_error("Failed to load dll " + name_);
             }
@@ -325,13 +330,17 @@ namespace
                 module_name = module_name_raw;
 
 #if defined(__MINGW32__)
-                std::string func = bfdc.get_function_name(frame.AddrPC.Offset);
+                std::pair<std::string, unsigned int> func_and_line = bfdc.get_function_name_and_line(frame.AddrPC.Offset);
 
-                if (func.empty())
+                if (func_and_line.first.empty())
                 {
+#if defined(_WIN64)
+                   DWORD64 dummy = 0;
+#else              
                     DWORD dummy = 0;
+#endif             
                     BOOL got_symbol = SymGetSymFromAddr(process, frame.AddrPC.Offset, &dummy, symbol);
-                    func = got_symbol ? symbol->Name : unknown_function;
+                    func_and_line.first = got_symbol ? symbol->Name : unknown_function;
                 }
 #else
                 DWORD dummy = 0;
@@ -339,7 +348,7 @@ namespace
                 std::string func = got_symbol ? symbol->Name : unknown_function;
 #endif
 
-            dbg::stack_frame f(reinterpret_cast<const void *>(frame.AddrPC.Offset), func, module_name);
+            dbg::stack_frame f(reinterpret_cast<const void *>(frame.AddrPC.Offset), func_and_line.first, func_and_line.second, module_name);
             frames.push_back(f);
         }
     }
@@ -415,16 +424,17 @@ namespace
 
 namespace dbg
 {
-    stack_frame::stack_frame(const void *instruction, const std::string &function, const std::string &module) :
+    stack_frame::stack_frame(const void *instruction, const std::string &function, unsigned int line, const std::string &module) :
         instruction(instruction),
         function(function),
+        line(line),
         module(module)
     {
     }
 
     std::ostream &operator<< (std::ostream &out, const stack_frame &frame)
     {
-        return out << frame.instruction << ": " << frame.function << " in " << frame.module;
+        return out << frame.instruction << ": " << frame.function << ":" << frame.line << " in " << frame.module;
     }
 
     stack::stack(depth_type limit)