aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2020-01-15 02:02:52 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2020-01-15 02:46:48 +0300
commita880209efe5a0fb82469d2deba6ebcf5636ecabc (patch)
tree17f1172d36ac34089982c08a0122a19c8fce47f7
parentmingw builds: implement proper unused parameter macro (diff)
downloadwinapi-debug-a880209efe5a0fb82469d2deba6ebcf5636ecabc.tar.gz
winapi-debug-a880209efe5a0fb82469d2deba6ebcf5636ecabc.zip
mingw builds: work around missing SymTagEnum
Diffstat (limited to '')
-rw-r--r--include/pdb/symbol.hpp24
-rw-r--r--utils/enum_symbols.cpp8
2 files changed, 22 insertions, 10 deletions
diff --git a/include/pdb/symbol.hpp b/include/pdb/symbol.hpp
index b9dff85..98379d8 100644
--- a/include/pdb/symbol.hpp
+++ b/include/pdb/symbol.hpp
@@ -13,12 +13,26 @@
#include <DbgHelp.h>
#include <Windows.h>
+#include <climits>
#include <cstddef>
#include <cstring>
#include <stdexcept>
#include <string>
namespace pdb {
+namespace symbol {
+
+// MinGW-w64 (as of version 7.0) doesn't have SymTagEnum
+typedef ULONG Tag;
+
+constexpr Tag SYM_TAG_FUNCTION = 5;
+
+#ifdef _MSC_VER
+static_assert(static_cast<Tag>(SymTagFunction) == SYM_TAG_FUNCTION,
+ "unexpected SymTagFunction value");
+#endif
+
+} // namespace symbol
class SymbolInfo {
public:
@@ -52,13 +66,11 @@ public:
Address get_offline_address() const { return raw.Address; }
- typedef ULONG Tag;
-
- Tag get_tag() const { return raw.Tag; }
+ symbol::Tag get_tag() const { return raw.Tag; }
- enum class Type : Tag {
- Function = SymTagFunction,
- RESERVED = SymTagMax,
+ enum class Type : symbol::Tag {
+ Function = symbol::SYM_TAG_FUNCTION,
+ RESERVED = ULONG_MAX,
};
Type get_type() const { return static_cast<Type>(get_tag()); }
diff --git a/utils/enum_symbols.cpp b/utils/enum_symbols.cpp
index 77171a5..bd8a82b 100644
--- a/utils/enum_symbols.cpp
+++ b/utils/enum_symbols.cpp
@@ -25,7 +25,7 @@ public:
"pdb", po::value<std::vector<PDB>>(&pdbs)->value_name("ADDR,PATH"), "load a PDB file");
visible.add_options()(
"functions",
- po::value<pdb::Symbol::Tag>(&tag)->implicit_value(function_tag)->zero_tokens(),
+ po::value<pdb::symbol::Tag>(&tag)->implicit_value(function_tag)->zero_tokens(),
"only list functions");
}
@@ -40,10 +40,10 @@ public:
pdb::Symbol::Type get_type() const { return static_cast<pdb::Symbol::Type>(tag); }
private:
- static const auto reserved_tag = static_cast<pdb::Symbol::Tag>(pdb::Symbol::Type::RESERVED);
- static const auto function_tag = static_cast<pdb::Symbol::Tag>(pdb::Symbol::Type::Function);
+ static const auto reserved_tag = static_cast<pdb::symbol::Tag>(pdb::Symbol::Type::RESERVED);
+ static const auto function_tag = static_cast<pdb::symbol::Tag>(pdb::Symbol::Type::Function);
- pdb::Symbol::Tag tag = reserved_tag;
+ pdb::symbol::Tag tag = reserved_tag;
};
} // namespace