| Index: snapshot/mac/process_types.cc
|
| diff --git a/snapshot/mac/process_types.cc b/snapshot/mac/process_types.cc
|
| index 196a01ddf4ce059623407e8cf92ffe9da5bfcfbe..0fc14f0e0b5e971b643bd98917a88688ae0bb028 100644
|
| --- a/snapshot/mac/process_types.cc
|
| +++ b/snapshot/mac/process_types.cc
|
| @@ -17,7 +17,6 @@
|
| #include <string.h>
|
| #include <uuid/uuid.h>
|
|
|
| -#include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "snapshot/mac/process_types/internal.h"
|
| #include "util/mach/task_memory.h"
|
| @@ -83,68 +82,58 @@ inline void Assign<uuid_t, uuid_t>(uuid_t* destination, const uuid_t& source) {
|
| // operates on each member in the struct.
|
| #define PROCESS_TYPE_STRUCT_IMPLEMENT 1
|
|
|
| -#define PROCESS_TYPE_STRUCT_BEGIN(struct_name) \
|
| - namespace crashpad { \
|
| - namespace process_types { \
|
| - \
|
| - /* static */ \
|
| - size_t struct_name::ExpectedSize(ProcessReader* process_reader) { \
|
| - if (!process_reader->Is64Bit()) { \
|
| - return internal::struct_name<internal::Traits32>::Size(); \
|
| - } else { \
|
| - return internal::struct_name<internal::Traits64>::Size(); \
|
| - } \
|
| - } \
|
| - \
|
| - /* static */ \
|
| - size_t struct_name::ExpectedSizeForVersion(ProcessReader* process_reader, \
|
| - uint64_t version) { \
|
| - if (!process_reader->Is64Bit()) { \
|
| - return internal::struct_name< \
|
| - internal::Traits32>::ExpectedSizeForVersion(version); \
|
| - } else { \
|
| - return internal::struct_name< \
|
| - internal::Traits64>::ExpectedSizeForVersion(version); \
|
| - } \
|
| - } \
|
| - \
|
| - /* static */ \
|
| - bool struct_name::ReadInto(ProcessReader* process_reader, \
|
| - mach_vm_address_t address, \
|
| - struct_name* generic) { \
|
| - if (!process_reader->Is64Bit()) { \
|
| - return ReadIntoInternal<internal::struct_name<internal::Traits32> >( \
|
| - process_reader, address, generic); \
|
| - } else { \
|
| - return ReadIntoInternal<internal::struct_name<internal::Traits64> >( \
|
| - process_reader, address, generic); \
|
| - } \
|
| - } \
|
| - \
|
| - /* static */ \
|
| - template <typename T> \
|
| - bool struct_name::ReadIntoInternal(ProcessReader* process_reader, \
|
| - mach_vm_address_t address, \
|
| - struct_name* generic) { \
|
| - T specific; \
|
| - if (!specific.Read(process_reader, address)) { \
|
| - return false; \
|
| - } \
|
| - specific.GenericizeInto(generic, &generic->size_); \
|
| - return true; \
|
| - } \
|
| - \
|
| - namespace internal { \
|
| - \
|
| - template <typename Traits> \
|
| - void struct_name<Traits>::GenericizeInto( \
|
| - process_types::struct_name* generic, \
|
| - size_t* specific_size) { \
|
| +#define PROCESS_TYPE_STRUCT_BEGIN(struct_name) \
|
| + namespace crashpad { \
|
| + namespace process_types { \
|
| + \
|
| + /* static */ \
|
| + size_t struct_name::ExpectedSize(ProcessReader* process_reader) { \
|
| + if (!process_reader->Is64Bit()) { \
|
| + return internal::struct_name<internal::Traits32>::Size(); \
|
| + } else { \
|
| + return internal::struct_name<internal::Traits64>::Size(); \
|
| + } \
|
| + } \
|
| + \
|
| + /* static */ \
|
| + bool struct_name::ReadInto(ProcessReader* process_reader, \
|
| + mach_vm_address_t address, \
|
| + struct_name* generic) { \
|
| + if (!process_reader->Is64Bit()) { \
|
| + return ReadIntoInternal<internal::struct_name<internal::Traits32> >( \
|
| + process_reader, address, generic); \
|
| + } else { \
|
| + return ReadIntoInternal<internal::struct_name<internal::Traits64> >( \
|
| + process_reader, address, generic); \
|
| + } \
|
| + } \
|
| + \
|
| + /* static */ \
|
| + template <typename T> \
|
| + bool struct_name::ReadIntoInternal(ProcessReader* process_reader, \
|
| + mach_vm_address_t address, \
|
| + struct_name* generic) { \
|
| + T specific; \
|
| + if (!specific.Read(process_reader, address)) { \
|
| + return false; \
|
| + } \
|
| + specific.GenericizeInto(generic, &generic->size_); \
|
| + return true; \
|
| + } \
|
| + \
|
| + namespace internal { \
|
| + \
|
| + template <typename Traits> \
|
| + void struct_name<Traits>::GenericizeInto( \
|
| + process_types::struct_name* generic, \
|
| + size_t* specific_size) { \
|
| *specific_size = Size();
|
|
|
| #define PROCESS_TYPE_STRUCT_MEMBER(member_type, member_name, ...) \
|
| Assign(&generic->member_name, member_name);
|
|
|
| +#define PROCESS_TYPE_STRUCT_VERSIONED(struct_name, version_field)
|
| +
|
| #define PROCESS_TYPE_STRUCT_END(struct_name) \
|
| } \
|
| } /* namespace internal */ \
|
| @@ -155,6 +144,7 @@ inline void Assign<uuid_t, uuid_t>(uuid_t* destination, const uuid_t& source) {
|
|
|
| #undef PROCESS_TYPE_STRUCT_BEGIN
|
| #undef PROCESS_TYPE_STRUCT_MEMBER
|
| +#undef PROCESS_TYPE_STRUCT_VERSIONED
|
| #undef PROCESS_TYPE_STRUCT_END
|
| #undef PROCESS_TYPE_STRUCT_IMPLEMENT
|
|
|
| @@ -185,12 +175,15 @@ inline void Assign<uuid_t, uuid_t>(uuid_t* destination, const uuid_t& source) {
|
|
|
| #define PROCESS_TYPE_STRUCT_MEMBER(member_type, member_name, ...)
|
|
|
| +#define PROCESS_TYPE_STRUCT_VERSIONED(struct_name, version_field)
|
| +
|
| #define PROCESS_TYPE_STRUCT_END(struct_name)
|
|
|
| #include "snapshot/mac/process_types/all.proctype"
|
|
|
| #undef PROCESS_TYPE_STRUCT_BEGIN
|
| #undef PROCESS_TYPE_STRUCT_MEMBER
|
| +#undef PROCESS_TYPE_STRUCT_VERSIONED
|
| #undef PROCESS_TYPE_STRUCT_END
|
| #undef PROCESS_TYPE_STRUCT_IMPLEMENT_INTERNAL_READ_INTO
|
|
|
| @@ -216,12 +209,6 @@ inline void Assign<uuid_t, uuid_t>(uuid_t* destination, const uuid_t& source) {
|
| address, sizeof(struct_name<Traits>[count]), specific); \
|
| } \
|
| \
|
| - /* static */ \
|
| - template <typename Traits> \
|
| - size_t struct_name<Traits>::ExpectedSizeForVersion(uint64_t version) { \
|
| - NOTREACHED(); \
|
| - return 0; \
|
| - } \
|
| } /* namespace internal */ \
|
| \
|
| /* static */ \
|
| @@ -261,11 +248,57 @@ inline void Assign<uuid_t, uuid_t>(uuid_t* destination, const uuid_t& source) {
|
|
|
| #define PROCESS_TYPE_STRUCT_MEMBER(member_type, member_name, ...)
|
|
|
| +#define PROCESS_TYPE_STRUCT_VERSIONED(struct_name, version_field)
|
| +
|
| #define PROCESS_TYPE_STRUCT_END(struct_name)
|
|
|
| #include "snapshot/mac/process_types/all.proctype"
|
|
|
| #undef PROCESS_TYPE_STRUCT_BEGIN
|
| #undef PROCESS_TYPE_STRUCT_MEMBER
|
| +#undef PROCESS_TYPE_STRUCT_VERSIONED
|
| #undef PROCESS_TYPE_STRUCT_END
|
| #undef PROCESS_TYPE_STRUCT_IMPLEMENT_ARRAY
|
| +
|
| +// Implement the generic crashpad::process_types::struct_name
|
| +// ExpectedSizeForVersion(), which delegates to the templatized
|
| +// ExpectedSizeForVersion(), which returns the expected size of a versioned
|
| +// structure given a version parameter. This is only implemented for structures
|
| +// that use PROCESS_TYPE_STRUCT_VERSIONED(), and implementations of the internal
|
| +// templatized functions must be provided in
|
| +// snapshot/mac/process_types/custom.cc.
|
| +#define PROCESS_TYPE_STRUCT_IMPLEMENT_VERSIONED 1
|
| +
|
| +#define PROCESS_TYPE_STRUCT_BEGIN(struct_name)
|
| +
|
| +#define PROCESS_TYPE_STRUCT_MEMBER(member_type, member_name, ...)
|
| +
|
| +#define PROCESS_TYPE_STRUCT_VERSIONED(struct_name, version_field) \
|
| + namespace crashpad { \
|
| + namespace process_types { \
|
| + \
|
| + /* static */ \
|
| + size_t struct_name::ExpectedSizeForVersion( \
|
| + ProcessReader* process_reader, \
|
| + decltype(struct_name::version_field) version) { \
|
| + if (!process_reader->Is64Bit()) { \
|
| + return internal::struct_name< \
|
| + internal::Traits32>::ExpectedSizeForVersion(version); \
|
| + } else { \
|
| + return internal::struct_name< \
|
| + internal::Traits64>::ExpectedSizeForVersion(version); \
|
| + } \
|
| + } \
|
| + \
|
| + } /* namespace process_types */ \
|
| + } /* namespace crashpad */
|
| +
|
| +#define PROCESS_TYPE_STRUCT_END(struct_name)
|
| +
|
| +#include "snapshot/mac/process_types/all.proctype"
|
| +
|
| +#undef PROCESS_TYPE_STRUCT_BEGIN
|
| +#undef PROCESS_TYPE_STRUCT_MEMBER
|
| +#undef PROCESS_TYPE_STRUCT_VERSIONED
|
| +#undef PROCESS_TYPE_STRUCT_END
|
| +#undef PROCESS_TYPE_STRUCT_IMPLEMENT_VERSIONED
|
|
|