remove openharmony nouse third libs
This commit is contained in:
parent
1c0bd0bc39
commit
b7423be99d
|
|
@ -1,53 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_
|
|
||||||
#define CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class CrashGenerationServer;
|
|
||||||
|
|
||||||
class ClientInfo {
|
|
||||||
public:
|
|
||||||
ClientInfo(pid_t pid, CrashGenerationServer* crash_server)
|
|
||||||
: crash_server_(crash_server),
|
|
||||||
pid_(pid) {}
|
|
||||||
|
|
||||||
CrashGenerationServer* crash_server() const { return crash_server_; }
|
|
||||||
pid_t pid() const { return pid_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
CrashGenerationServer* crash_server_;
|
|
||||||
pid_t pid_;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
||||||
#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
||||||
|
|
||||||
#include "common/basictypes.h"
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// CrashGenerationClient is an interface for implementing out-of-process crash
|
|
||||||
// dumping. The default implementation, accessed via the TryCreate() factory,
|
|
||||||
// works in conjunction with the CrashGenerationServer to generate a minidump
|
|
||||||
// via a remote process.
|
|
||||||
class CrashGenerationClient {
|
|
||||||
public:
|
|
||||||
CrashGenerationClient() {}
|
|
||||||
virtual ~CrashGenerationClient() {}
|
|
||||||
|
|
||||||
// Request the crash server to generate a dump. |blob| is an opaque
|
|
||||||
// CrashContext pointer from exception_handler.h.
|
|
||||||
// Returns true if the dump was successful; false otherwise.
|
|
||||||
virtual bool RequestDump(const void* blob, size_t blob_size) = 0;
|
|
||||||
|
|
||||||
// Returns a new CrashGenerationClient if |server_fd| is valid and
|
|
||||||
// connects to a CrashGenerationServer. Otherwise, return NULL.
|
|
||||||
// The returned CrashGenerationClient* is owned by the caller of
|
|
||||||
// this function.
|
|
||||||
static CrashGenerationClient* TryCreate(int server_fd);
|
|
||||||
|
|
||||||
private:
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(CrashGenerationClient);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
|
|
||||||
|
|
@ -1,135 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_
|
|
||||||
#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_
|
|
||||||
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class ClientInfo;
|
|
||||||
|
|
||||||
class CrashGenerationServer {
|
|
||||||
public:
|
|
||||||
// WARNING: callbacks may be invoked on a different thread
|
|
||||||
// than that which creates the CrashGenerationServer. They must
|
|
||||||
// be thread safe.
|
|
||||||
typedef void (*OnClientDumpRequestCallback)(void* context,
|
|
||||||
const ClientInfo* client_info,
|
|
||||||
const string* file_path);
|
|
||||||
|
|
||||||
typedef void (*OnClientExitingCallback)(void* context,
|
|
||||||
const ClientInfo* client_info);
|
|
||||||
|
|
||||||
// Create an instance with the given parameters.
|
|
||||||
//
|
|
||||||
// Parameter listen_fd: The server fd created by CreateReportChannel().
|
|
||||||
// Parameter dump_callback: Callback for a client crash dump request.
|
|
||||||
// Parameter dump_context: Context for client crash dump request callback.
|
|
||||||
// Parameter exit_callback: Callback for client process exit.
|
|
||||||
// Parameter exit_context: Context for client exit callback.
|
|
||||||
// Parameter generate_dumps: Whether to automatically generate dumps.
|
|
||||||
// Client code of this class might want to generate dumps explicitly
|
|
||||||
// in the crash dump request callback. In that case, false can be
|
|
||||||
// passed for this parameter.
|
|
||||||
// Parameter dump_path: Path for generating dumps; required only if true is
|
|
||||||
// passed for generateDumps parameter; NULL can be passed otherwise.
|
|
||||||
CrashGenerationServer(const int listen_fd,
|
|
||||||
OnClientDumpRequestCallback dump_callback,
|
|
||||||
void* dump_context,
|
|
||||||
OnClientExitingCallback exit_callback,
|
|
||||||
void* exit_context,
|
|
||||||
bool generate_dumps,
|
|
||||||
const string* dump_path);
|
|
||||||
|
|
||||||
~CrashGenerationServer();
|
|
||||||
|
|
||||||
// Perform initialization steps needed to start listening to clients.
|
|
||||||
//
|
|
||||||
// Return true if initialization is successful; false otherwise.
|
|
||||||
bool Start();
|
|
||||||
|
|
||||||
// Stop the server.
|
|
||||||
void Stop();
|
|
||||||
|
|
||||||
// Create a "channel" that can be used by clients to report crashes
|
|
||||||
// to a CrashGenerationServer. |*server_fd| should be passed to
|
|
||||||
// this class's constructor, and |*client_fd| should be passed to
|
|
||||||
// the ExceptionHandler constructor in the client process.
|
|
||||||
static bool CreateReportChannel(int* server_fd, int* client_fd);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Run the server's event loop
|
|
||||||
void Run();
|
|
||||||
|
|
||||||
// Invoked when an child process (client) event occurs
|
|
||||||
// Returning true => "keep running", false => "exit loop"
|
|
||||||
bool ClientEvent(short revents);
|
|
||||||
|
|
||||||
// Invoked when the controlling thread (main) event occurs
|
|
||||||
// Returning true => "keep running", false => "exit loop"
|
|
||||||
bool ControlEvent(short revents);
|
|
||||||
|
|
||||||
// Return a unique filename at which a minidump can be written
|
|
||||||
bool MakeMinidumpFilename(string& outFilename);
|
|
||||||
|
|
||||||
// Trampoline to |Run()|
|
|
||||||
static void* ThreadMain(void* arg);
|
|
||||||
|
|
||||||
int server_fd_;
|
|
||||||
|
|
||||||
OnClientDumpRequestCallback dump_callback_;
|
|
||||||
void* dump_context_;
|
|
||||||
|
|
||||||
OnClientExitingCallback exit_callback_;
|
|
||||||
void* exit_context_;
|
|
||||||
|
|
||||||
bool generate_dumps_;
|
|
||||||
|
|
||||||
string dump_dir_;
|
|
||||||
|
|
||||||
bool started_;
|
|
||||||
|
|
||||||
pthread_t thread_;
|
|
||||||
int control_pipe_in_;
|
|
||||||
int control_pipe_out_;
|
|
||||||
|
|
||||||
// disable these
|
|
||||||
CrashGenerationServer(const CrashGenerationServer&);
|
|
||||||
CrashGenerationServer& operator=(const CrashGenerationServer&);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <list>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// One of these is produced for each mapping in the process (i.e. line in
|
|
||||||
// /proc/$x/maps).
|
|
||||||
struct MappingInfo {
|
|
||||||
// On Android, relocation packing can mean that the reported start
|
|
||||||
// address of the mapping must be adjusted by a bias in order to
|
|
||||||
// compensate for the compression of the relocation section. The
|
|
||||||
// following two members hold (after LateInit) the adjusted mapping
|
|
||||||
// range. See crbug.com/606972 for more information.
|
|
||||||
uintptr_t start_addr;
|
|
||||||
size_t size;
|
|
||||||
// When Android relocation packing causes |start_addr| and |size| to
|
|
||||||
// be modified with a load bias, we need to remember the unbiased
|
|
||||||
// address range. The following structure holds the original mapping
|
|
||||||
// address range as reported by the operating system.
|
|
||||||
struct {
|
|
||||||
uintptr_t start_addr;
|
|
||||||
uintptr_t end_addr;
|
|
||||||
} system_mapping_info;
|
|
||||||
size_t offset; // offset into the backed file.
|
|
||||||
bool exec; // true if the mapping has the execute bit set.
|
|
||||||
char name[NAME_MAX];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MappingEntry {
|
|
||||||
MappingInfo first;
|
|
||||||
uint8_t second[sizeof(MDGUID)];
|
|
||||||
};
|
|
||||||
|
|
||||||
// A list of <MappingInfo, GUID>
|
|
||||||
typedef std::list<MappingEntry> MappingList;
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_MAPPING_INFO_H_
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
typedef MDRawContextX86 RawContextCPU;
|
|
||||||
#elif defined(__x86_64)
|
|
||||||
typedef MDRawContextAMD64 RawContextCPU;
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
typedef MDRawContextARM RawContextCPU;
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
typedef MDRawContextARM64_Old RawContextCPU;
|
|
||||||
#elif defined(__mips__)
|
|
||||||
typedef MDRawContextMIPS RawContextCPU;
|
|
||||||
#else
|
|
||||||
#error "This code has not been ported to your platform yet."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_RAW_CONTEXT_CPU_H
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_
|
|
||||||
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/raw_context_cpu.h"
|
|
||||||
#include "common/memory_allocator.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
typedef __typeof__(((struct user*) 0)->u_debugreg[0]) debugreg_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// We produce one of these structures for each thread in the crashed process.
|
|
||||||
struct ThreadInfo {
|
|
||||||
pid_t tgid; // thread group id
|
|
||||||
pid_t ppid; // parent process
|
|
||||||
|
|
||||||
uintptr_t stack_pointer; // thread stack pointer
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__i386) || defined(__x86_64)
|
|
||||||
user_regs_struct regs;
|
|
||||||
user_fpregs_struct fpregs;
|
|
||||||
static const unsigned kNumDebugRegisters = 8;
|
|
||||||
debugreg_t dregs[8];
|
|
||||||
#if defined(__i386)
|
|
||||||
user_fpxregs_struct fpxregs;
|
|
||||||
#endif // defined(__i386)
|
|
||||||
|
|
||||||
#elif defined(__ARM_EABI__)
|
|
||||||
// Mimicking how strace does this(see syscall.c, search for GETREGS)
|
|
||||||
struct user_regs regs;
|
|
||||||
struct user_fpregs fpregs;
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
// Use the structures defined in <sys/user.h>
|
|
||||||
struct user_regs_struct regs;
|
|
||||||
struct user_fpsimd_struct fpregs;
|
|
||||||
#elif defined(__mips__)
|
|
||||||
// Use the structure defined in <sys/ucontext.h>.
|
|
||||||
mcontext_t mcontext;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Returns the instruction pointer (platform-dependent impl.).
|
|
||||||
uintptr_t GetInstructionPointer() const;
|
|
||||||
|
|
||||||
// Fills a RawContextCPU using the context in the ThreadInfo object.
|
|
||||||
void FillCPUContext(RawContextCPU* out) const;
|
|
||||||
|
|
||||||
// Returns the pointer and size of general purpose register area.
|
|
||||||
void GetGeneralPurposeRegisters(void** gp_regs, size_t* size);
|
|
||||||
|
|
||||||
// Returns the pointer and size of float point register area.
|
|
||||||
void GetFloatingPointRegisters(void** fp_regs, size_t* size);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_THREAD_INFO_H_
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H
|
|
||||||
#define CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H
|
|
||||||
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/raw_context_cpu.h"
|
|
||||||
#include "common/memory_allocator.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Wraps platform-dependent implementations of accessors to ucontext_t structs.
|
|
||||||
struct UContextReader {
|
|
||||||
static uintptr_t GetStackPointer(const ucontext_t* uc);
|
|
||||||
|
|
||||||
static uintptr_t GetInstructionPointer(const ucontext_t* uc);
|
|
||||||
|
|
||||||
// Juggle a arch-specific ucontext_t into a minidump format
|
|
||||||
// out: the minidump structure
|
|
||||||
// info: the collection of register structures.
|
|
||||||
#if defined(__i386__) || defined(__x86_64)
|
|
||||||
static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
|
|
||||||
const struct _libc_fpstate* fp);
|
|
||||||
#elif defined(__aarch64__)
|
|
||||||
static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc,
|
|
||||||
const struct fpsimd_context* fpregs);
|
|
||||||
#else
|
|
||||||
static void FillCPUContext(RawContextCPU *out, const ucontext_t *uc);
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_DUMP_WRITER_COMMON_UCONTEXT_READER_H
|
|
||||||
|
|
@ -1,281 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
|
||||||
#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
|
||||||
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "client/linux/crash_generation/crash_generation_client.h"
|
|
||||||
#include "client/linux/handler/minidump_descriptor.h"
|
|
||||||
#include "client/linux/minidump_writer/minidump_writer.h"
|
|
||||||
#include "common/scoped_ptr.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// ExceptionHandler
|
|
||||||
//
|
|
||||||
// ExceptionHandler can write a minidump file when an exception occurs,
|
|
||||||
// or when WriteMinidump() is called explicitly by your program.
|
|
||||||
//
|
|
||||||
// To have the exception handler write minidumps when an uncaught exception
|
|
||||||
// (crash) occurs, you should create an instance early in the execution
|
|
||||||
// of your program, and keep it around for the entire time you want to
|
|
||||||
// have crash handling active (typically, until shutdown).
|
|
||||||
// (NOTE): There should be only be one this kind of exception handler
|
|
||||||
// object per process.
|
|
||||||
//
|
|
||||||
// If you want to write minidumps without installing the exception handler,
|
|
||||||
// you can create an ExceptionHandler with install_handler set to false,
|
|
||||||
// then call WriteMinidump. You can also use this technique if you want to
|
|
||||||
// use different minidump callbacks for different call sites.
|
|
||||||
//
|
|
||||||
// In either case, a callback function is called when a minidump is written,
|
|
||||||
// which receives the full path or file descriptor of the minidump. The
|
|
||||||
// caller can collect and write additional application state to that minidump,
|
|
||||||
// and launch an external crash-reporting application.
|
|
||||||
//
|
|
||||||
// Caller should try to make the callbacks as crash-friendly as possible,
|
|
||||||
// it should avoid use heap memory allocation as much as possible.
|
|
||||||
|
|
||||||
class ExceptionHandler {
|
|
||||||
public:
|
|
||||||
// A callback function to run before Breakpad performs any substantial
|
|
||||||
// processing of an exception. A FilterCallback is called before writing
|
|
||||||
// a minidump. |context| is the parameter supplied by the user as
|
|
||||||
// callback_context when the handler was created.
|
|
||||||
//
|
|
||||||
// If a FilterCallback returns true, Breakpad will continue processing,
|
|
||||||
// attempting to write a minidump. If a FilterCallback returns false,
|
|
||||||
// Breakpad will immediately report the exception as unhandled without
|
|
||||||
// writing a minidump, allowing another handler the opportunity to handle it.
|
|
||||||
typedef bool (*FilterCallback)(void *context);
|
|
||||||
|
|
||||||
// A callback function to run after the minidump has been written.
|
|
||||||
// |descriptor| contains the file descriptor or file path containing the
|
|
||||||
// minidump. |context| is the parameter supplied by the user as
|
|
||||||
// callback_context when the handler was created. |succeeded| indicates
|
|
||||||
// whether a minidump file was successfully written.
|
|
||||||
//
|
|
||||||
// If an exception occurred and the callback returns true, Breakpad will
|
|
||||||
// treat the exception as fully-handled, suppressing any other handlers from
|
|
||||||
// being notified of the exception. If the callback returns false, Breakpad
|
|
||||||
// will treat the exception as unhandled, and allow another handler to handle
|
|
||||||
// it. If there are no other handlers, Breakpad will report the exception to
|
|
||||||
// the system as unhandled, allowing a debugger or native crash dialog the
|
|
||||||
// opportunity to handle the exception. Most callback implementations
|
|
||||||
// should normally return the value of |succeeded|, or when they wish to
|
|
||||||
// not report an exception of handled, false. Callbacks will rarely want to
|
|
||||||
// return true directly (unless |succeeded| is true).
|
|
||||||
typedef bool (*MinidumpCallback)(const MinidumpDescriptor& descriptor,
|
|
||||||
void* context,
|
|
||||||
bool succeeded);
|
|
||||||
|
|
||||||
// In certain cases, a user may wish to handle the generation of the minidump
|
|
||||||
// themselves. In this case, they can install a handler callback which is
|
|
||||||
// called when a crash has occurred. If this function returns true, no other
|
|
||||||
// processing of occurs and the process will shortly be crashed. If this
|
|
||||||
// returns false, the normal processing continues.
|
|
||||||
typedef bool (*HandlerCallback)(const void* crash_context,
|
|
||||||
size_t crash_context_size,
|
|
||||||
void* context);
|
|
||||||
|
|
||||||
// Creates a new ExceptionHandler instance to handle writing minidumps.
|
|
||||||
// Before writing a minidump, the optional |filter| callback will be called.
|
|
||||||
// Its return value determines whether or not Breakpad should write a
|
|
||||||
// minidump. The minidump content will be written to the file path or file
|
|
||||||
// descriptor from |descriptor|, and the optional |callback| is called after
|
|
||||||
// writing the dump file, as described above.
|
|
||||||
// If install_handler is true, then a minidump will be written whenever
|
|
||||||
// an unhandled exception occurs. If it is false, minidumps will only
|
|
||||||
// be written when WriteMinidump is called.
|
|
||||||
// If |server_fd| is valid, the minidump is generated out-of-process. If it
|
|
||||||
// is -1, in-process generation will always be used.
|
|
||||||
ExceptionHandler(const MinidumpDescriptor& descriptor,
|
|
||||||
FilterCallback filter,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context,
|
|
||||||
bool install_handler,
|
|
||||||
const int server_fd);
|
|
||||||
~ExceptionHandler();
|
|
||||||
|
|
||||||
const MinidumpDescriptor& minidump_descriptor() const {
|
|
||||||
return minidump_descriptor_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_minidump_descriptor(const MinidumpDescriptor& descriptor) {
|
|
||||||
minidump_descriptor_ = descriptor;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_crash_handler(HandlerCallback callback) {
|
|
||||||
crash_handler_ = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_crash_generation_client(CrashGenerationClient* client) {
|
|
||||||
crash_generation_client_.reset(client);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Writes a minidump immediately. This can be used to capture the execution
|
|
||||||
// state independently of a crash.
|
|
||||||
// Returns true on success.
|
|
||||||
// If the ExceptionHandler has been created with a path, a new file is
|
|
||||||
// generated for each minidump. The file path can be retrieved in the
|
|
||||||
// MinidumpDescriptor passed to the MinidumpCallback or by accessing the
|
|
||||||
// MinidumpDescriptor directly from the ExceptionHandler (with
|
|
||||||
// minidump_descriptor()).
|
|
||||||
// If the ExceptionHandler has been created with a file descriptor, the file
|
|
||||||
// descriptor is repositioned to its beginning and the previous generated
|
|
||||||
// minidump is overwritten.
|
|
||||||
// Note that this method is not supposed to be called from a compromised
|
|
||||||
// context as it uses the heap.
|
|
||||||
bool WriteMinidump();
|
|
||||||
|
|
||||||
// Convenience form of WriteMinidump which does not require an
|
|
||||||
// ExceptionHandler instance.
|
|
||||||
static bool WriteMinidump(const string& dump_path,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context);
|
|
||||||
|
|
||||||
// Write a minidump of |child| immediately. This can be used to
|
|
||||||
// capture the execution state of |child| independently of a crash.
|
|
||||||
// Pass a meaningful |child_blamed_thread| to make that thread in
|
|
||||||
// the child process the one from which a crash signature is
|
|
||||||
// extracted.
|
|
||||||
//
|
|
||||||
// WARNING: the return of this function *must* happen before
|
|
||||||
// the code that will eventually reap |child| executes.
|
|
||||||
// Otherwise there's a pernicious race condition in which |child|
|
|
||||||
// exits, is reaped, another process created with its pid, then that
|
|
||||||
// new process dumped.
|
|
||||||
static bool WriteMinidumpForChild(pid_t child,
|
|
||||||
pid_t child_blamed_thread,
|
|
||||||
const string& dump_path,
|
|
||||||
MinidumpCallback callback,
|
|
||||||
void* callback_context);
|
|
||||||
|
|
||||||
// This structure is passed to minidump_writer.h:WriteMinidump via an opaque
|
|
||||||
// blob. It shouldn't be needed in any user code.
|
|
||||||
struct CrashContext {
|
|
||||||
siginfo_t siginfo;
|
|
||||||
pid_t tid; // the crashing thread.
|
|
||||||
ucontext_t context;
|
|
||||||
#if !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
// #ifdef this out because FP state is not part of user ABI for Linux ARM.
|
|
||||||
// In case of MIPS Linux FP state is already part of ucontext_t so
|
|
||||||
// 'float_state' is not required.
|
|
||||||
fpstate_t float_state;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
// Returns whether out-of-process dump generation is used or not.
|
|
||||||
bool IsOutOfProcess() const {
|
|
||||||
return crash_generation_client_.get() != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add information about a memory mapping. This can be used if
|
|
||||||
// a custom library loader is used that maps things in a way
|
|
||||||
// that the linux dumper can't handle by reading the maps file.
|
|
||||||
void AddMappingInfo(const string& name,
|
|
||||||
const uint8_t identifier[sizeof(MDGUID)],
|
|
||||||
uintptr_t start_address,
|
|
||||||
size_t mapping_size,
|
|
||||||
size_t file_offset);
|
|
||||||
|
|
||||||
// Register a block of memory of length bytes starting at address ptr
|
|
||||||
// to be copied to the minidump when a crash happens.
|
|
||||||
void RegisterAppMemory(void* ptr, size_t length);
|
|
||||||
|
|
||||||
// Unregister a block of memory that was registered with RegisterAppMemory.
|
|
||||||
void UnregisterAppMemory(void* ptr);
|
|
||||||
|
|
||||||
// Force signal handling for the specified signal.
|
|
||||||
bool SimulateSignalDelivery(int sig);
|
|
||||||
|
|
||||||
// Report a crash signal from an SA_SIGINFO signal handler.
|
|
||||||
bool HandleSignal(int sig, siginfo_t* info, void* uc);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Save the old signal handlers and install new ones.
|
|
||||||
static bool InstallHandlersLocked();
|
|
||||||
// Restore the old signal handlers.
|
|
||||||
static void RestoreHandlersLocked();
|
|
||||||
|
|
||||||
void PreresolveSymbols();
|
|
||||||
bool GenerateDump(CrashContext *context);
|
|
||||||
void SendContinueSignalToChild();
|
|
||||||
void WaitForContinueSignal();
|
|
||||||
|
|
||||||
static void SignalHandler(int sig, siginfo_t* info, void* uc);
|
|
||||||
static int ThreadEntry(void* arg);
|
|
||||||
bool DoDump(pid_t crashing_process, const void* context,
|
|
||||||
size_t context_size);
|
|
||||||
|
|
||||||
const FilterCallback filter_;
|
|
||||||
const MinidumpCallback callback_;
|
|
||||||
void* const callback_context_;
|
|
||||||
|
|
||||||
scoped_ptr<CrashGenerationClient> crash_generation_client_;
|
|
||||||
|
|
||||||
MinidumpDescriptor minidump_descriptor_;
|
|
||||||
|
|
||||||
// Must be volatile. The compiler is unaware of the code which runs in
|
|
||||||
// the signal handler which reads this variable. Without volatile the
|
|
||||||
// compiler is free to optimise away writes to this variable which it
|
|
||||||
// believes are never read.
|
|
||||||
volatile HandlerCallback crash_handler_;
|
|
||||||
|
|
||||||
// We need to explicitly enable ptrace of parent processes on some
|
|
||||||
// kernels, but we need to know the PID of the cloned process before we
|
|
||||||
// can do this. We create a pipe which we can use to block the
|
|
||||||
// cloned process after creating it, until we have explicitly enabled
|
|
||||||
// ptrace. This is used to store the file descriptors for the pipe
|
|
||||||
int fdes[2] = {-1, -1};
|
|
||||||
|
|
||||||
// Callers can add extra info about mappings for cases where the
|
|
||||||
// dumper code cannot extract enough information from /proc/<pid>/maps.
|
|
||||||
MappingList mapping_list_;
|
|
||||||
|
|
||||||
// Callers can request additional memory regions to be included in
|
|
||||||
// the dump.
|
|
||||||
AppMemoryList app_memory_list_;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef bool (*FirstChanceHandler)(int, siginfo_t*, void*);
|
|
||||||
void SetFirstChanceExceptionHandler(FirstChanceHandler callback);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
// Copyright 2015 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_
|
|
||||||
#define CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
struct MicrodumpExtraInfo {
|
|
||||||
// Strings pointed to by this struct are not copied, and are
|
|
||||||
// expected to remain valid for the lifetime of the process.
|
|
||||||
const char* build_fingerprint;
|
|
||||||
const char* product_info;
|
|
||||||
const char* gpu_fingerprint;
|
|
||||||
const char* process_type;
|
|
||||||
|
|
||||||
MicrodumpExtraInfo()
|
|
||||||
: build_fingerprint(NULL),
|
|
||||||
product_info(NULL),
|
|
||||||
gpu_fingerprint(NULL),
|
|
||||||
process_type(NULL) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_MICRODUMP_EXTRA_INFO_H_
|
|
||||||
|
|
@ -1,199 +0,0 @@
|
||||||
// Copyright (c) 2012 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_
|
|
||||||
#define CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "client/linux/handler/microdump_extra_info.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
// This class describes how a crash dump should be generated, either:
|
|
||||||
// - Writing a full minidump to a file in a given directory (the actual path,
|
|
||||||
// inside the directory, is determined by this class).
|
|
||||||
// - Writing a full minidump to a given fd.
|
|
||||||
// - Writing a reduced microdump to the console (logcat on Android).
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class MinidumpDescriptor {
|
|
||||||
public:
|
|
||||||
struct MicrodumpOnConsole {};
|
|
||||||
static const MicrodumpOnConsole kMicrodumpOnConsole;
|
|
||||||
|
|
||||||
MinidumpDescriptor()
|
|
||||||
: mode_(kUninitialized),
|
|
||||||
fd_(-1),
|
|
||||||
size_limit_(-1),
|
|
||||||
address_within_principal_mapping_(0),
|
|
||||||
skip_dump_if_principal_mapping_not_referenced_(false) {}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(const string& directory)
|
|
||||||
: mode_(kWriteMinidumpToFile),
|
|
||||||
fd_(-1),
|
|
||||||
directory_(directory),
|
|
||||||
c_path_(NULL),
|
|
||||||
size_limit_(-1),
|
|
||||||
address_within_principal_mapping_(0),
|
|
||||||
skip_dump_if_principal_mapping_not_referenced_(false),
|
|
||||||
sanitize_stacks_(false) {
|
|
||||||
assert(!directory.empty());
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(int fd)
|
|
||||||
: mode_(kWriteMinidumpToFd),
|
|
||||||
fd_(fd),
|
|
||||||
c_path_(NULL),
|
|
||||||
size_limit_(-1),
|
|
||||||
address_within_principal_mapping_(0),
|
|
||||||
skip_dump_if_principal_mapping_not_referenced_(false),
|
|
||||||
sanitize_stacks_(false) {
|
|
||||||
assert(fd != -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(const MicrodumpOnConsole&)
|
|
||||||
: mode_(kWriteMicrodumpToConsole),
|
|
||||||
fd_(-1),
|
|
||||||
size_limit_(-1),
|
|
||||||
address_within_principal_mapping_(0),
|
|
||||||
skip_dump_if_principal_mapping_not_referenced_(false),
|
|
||||||
sanitize_stacks_(false) {}
|
|
||||||
|
|
||||||
explicit MinidumpDescriptor(const MinidumpDescriptor& descriptor);
|
|
||||||
MinidumpDescriptor& operator=(const MinidumpDescriptor& descriptor);
|
|
||||||
|
|
||||||
static MinidumpDescriptor getMicrodumpDescriptor();
|
|
||||||
|
|
||||||
bool IsFD() const { return mode_ == kWriteMinidumpToFd; }
|
|
||||||
|
|
||||||
int fd() const { return fd_; }
|
|
||||||
|
|
||||||
string directory() const { return directory_; }
|
|
||||||
|
|
||||||
const char* path() const { return c_path_; }
|
|
||||||
|
|
||||||
bool IsMicrodumpOnConsole() const {
|
|
||||||
return mode_ == kWriteMicrodumpToConsole;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Updates the path so it is unique.
|
|
||||||
// Should be called from a normal context: this methods uses the heap.
|
|
||||||
void UpdatePath();
|
|
||||||
|
|
||||||
off_t size_limit() const { return size_limit_; }
|
|
||||||
void set_size_limit(off_t limit) { size_limit_ = limit; }
|
|
||||||
|
|
||||||
uintptr_t address_within_principal_mapping() const {
|
|
||||||
return address_within_principal_mapping_;
|
|
||||||
}
|
|
||||||
void set_address_within_principal_mapping(
|
|
||||||
uintptr_t address_within_principal_mapping) {
|
|
||||||
address_within_principal_mapping_ = address_within_principal_mapping;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool skip_dump_if_principal_mapping_not_referenced() {
|
|
||||||
return skip_dump_if_principal_mapping_not_referenced_;
|
|
||||||
}
|
|
||||||
void set_skip_dump_if_principal_mapping_not_referenced(
|
|
||||||
bool skip_dump_if_principal_mapping_not_referenced) {
|
|
||||||
skip_dump_if_principal_mapping_not_referenced_ =
|
|
||||||
skip_dump_if_principal_mapping_not_referenced;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sanitize_stacks() const { return sanitize_stacks_; }
|
|
||||||
void set_sanitize_stacks(bool sanitize_stacks) {
|
|
||||||
sanitize_stacks_ = sanitize_stacks;
|
|
||||||
}
|
|
||||||
|
|
||||||
MicrodumpExtraInfo* microdump_extra_info() {
|
|
||||||
assert(IsMicrodumpOnConsole());
|
|
||||||
return µdump_extra_info_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
enum DumpMode {
|
|
||||||
kUninitialized = 0,
|
|
||||||
kWriteMinidumpToFile,
|
|
||||||
kWriteMinidumpToFd,
|
|
||||||
kWriteMicrodumpToConsole
|
|
||||||
};
|
|
||||||
|
|
||||||
// Specifies the dump mode (see DumpMode).
|
|
||||||
DumpMode mode_;
|
|
||||||
|
|
||||||
// The file descriptor where the minidump is generated.
|
|
||||||
int fd_;
|
|
||||||
|
|
||||||
// The directory where the minidump should be generated.
|
|
||||||
string directory_;
|
|
||||||
|
|
||||||
// The full path to the generated minidump.
|
|
||||||
string path_;
|
|
||||||
|
|
||||||
// The C string of |path_|. Precomputed so it can be access from a compromised
|
|
||||||
// context.
|
|
||||||
const char* c_path_;
|
|
||||||
|
|
||||||
off_t size_limit_;
|
|
||||||
|
|
||||||
// This member points somewhere into the main module for this
|
|
||||||
// process (the module that is considerered interesting for the
|
|
||||||
// purposes of debugging crashes).
|
|
||||||
uintptr_t address_within_principal_mapping_;
|
|
||||||
|
|
||||||
// If set, threads that do not reference the address range
|
|
||||||
// associated with |address_within_principal_mapping_| will not have their
|
|
||||||
// stacks logged.
|
|
||||||
bool skip_dump_if_principal_mapping_not_referenced_;
|
|
||||||
|
|
||||||
// If set, stacks are sanitized to remove PII. This involves
|
|
||||||
// overwriting any pointer-aligned words that are not either
|
|
||||||
// pointers into a process mapping or small integers (+/-4096). This
|
|
||||||
// leaves enough information to unwind stacks, and preserve some
|
|
||||||
// register values, but elides strings and other program data.
|
|
||||||
bool sanitize_stacks_;
|
|
||||||
|
|
||||||
// The extra microdump data (e.g. product name/version, build
|
|
||||||
// fingerprint, gpu fingerprint) that should be appended to the dump
|
|
||||||
// (microdump only). Microdumps don't have the ability of appending
|
|
||||||
// extra metadata after the dump is generated (as opposite to
|
|
||||||
// minidumps MIME fields), therefore the extra data must be provided
|
|
||||||
// upfront. Any memory pointed to by members of the
|
|
||||||
// MicrodumpExtraInfo struct must be valid for the lifetime of the
|
|
||||||
// process (read: the caller has to guarantee that it is stored in
|
|
||||||
// global static storage.)
|
|
||||||
MicrodumpExtraInfo microdump_extra_info_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_MINIDUMP_DESCRIPTOR_H_
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/mapping_info.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
struct MicrodumpExtraInfo;
|
|
||||||
|
|
||||||
// Writes a microdump (a reduced dump containing only the state of the crashing
|
|
||||||
// thread) on the console (logcat on Android). These functions do not malloc nor
|
|
||||||
// use libc functions which may. Thus, it can be used in contexts where the
|
|
||||||
// state of the heap may be corrupt.
|
|
||||||
// Args:
|
|
||||||
// crashing_process: the pid of the crashing process. This must be trusted.
|
|
||||||
// blob: a blob of data from the crashing process. See exception_handler.h
|
|
||||||
// blob_size: the length of |blob| in bytes.
|
|
||||||
// mappings: a list of additional mappings provided by the application.
|
|
||||||
// build_fingerprint: a (optional) C string which determines the OS
|
|
||||||
// build fingerprint (e.g., aosp/occam/mako:5.1.1/LMY47W/1234:eng/dev-keys).
|
|
||||||
// product_info: a (optional) C string which determines the product name and
|
|
||||||
// version (e.g., WebView:42.0.2311.136).
|
|
||||||
//
|
|
||||||
// Returns true iff successful.
|
|
||||||
bool WriteMicrodump(pid_t crashing_process,
|
|
||||||
const void* blob,
|
|
||||||
size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
bool skip_dump_if_main_module_not_referenced,
|
|
||||||
uintptr_t address_within_main_module,
|
|
||||||
bool sanitize_stack,
|
|
||||||
const MicrodumpExtraInfo& microdump_extra_info);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_MICRODUMP_WRITER_H_
|
|
||||||
|
|
@ -1,144 +0,0 @@
|
||||||
// Copyright (c) 2013, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Helper class used to model a set of CPUs, as read from sysfs
|
|
||||||
// files like /sys/devices/system/cpu/present
|
|
||||||
// See See http://www.kernel.org/doc/Documentation/cputopology.txt
|
|
||||||
class CpuSet {
|
|
||||||
public:
|
|
||||||
// The maximum number of supported CPUs.
|
|
||||||
static const size_t kMaxCpus = 1024;
|
|
||||||
|
|
||||||
CpuSet() {
|
|
||||||
my_memset(mask_, 0, sizeof(mask_));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parse a sysfs file to extract the corresponding CPU set.
|
|
||||||
bool ParseSysFile(int fd) {
|
|
||||||
char buffer[512];
|
|
||||||
int ret = sys_read(fd, buffer, sizeof(buffer)-1);
|
|
||||||
if (ret < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
buffer[ret] = '\0';
|
|
||||||
|
|
||||||
// Expected format: comma-separated list of items, where each
|
|
||||||
// item can be a decimal integer, or two decimal integers separated
|
|
||||||
// by a dash.
|
|
||||||
// E.g.:
|
|
||||||
// 0
|
|
||||||
// 0,1,2,3
|
|
||||||
// 0-3
|
|
||||||
// 1,10-23
|
|
||||||
const char* p = buffer;
|
|
||||||
const char* p_end = p + ret;
|
|
||||||
while (p < p_end) {
|
|
||||||
// Skip leading space, if any
|
|
||||||
while (p < p_end && my_isspace(*p))
|
|
||||||
p++;
|
|
||||||
|
|
||||||
// Find start and size of current item.
|
|
||||||
const char* item = p;
|
|
||||||
size_t item_len = static_cast<size_t>(p_end - p);
|
|
||||||
const char* item_next =
|
|
||||||
static_cast<const char*>(my_memchr(p, ',', item_len));
|
|
||||||
if (item_next != NULL) {
|
|
||||||
p = item_next + 1;
|
|
||||||
item_len = static_cast<size_t>(item_next - item);
|
|
||||||
} else {
|
|
||||||
p = p_end;
|
|
||||||
item_next = p_end;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore trailing spaces.
|
|
||||||
while (item_next > item && my_isspace(item_next[-1]))
|
|
||||||
item_next--;
|
|
||||||
|
|
||||||
// skip empty items.
|
|
||||||
if (item_next == item)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// read first decimal value.
|
|
||||||
uintptr_t start = 0;
|
|
||||||
const char* next = my_read_decimal_ptr(&start, item);
|
|
||||||
uintptr_t end = start;
|
|
||||||
if (*next == '-')
|
|
||||||
my_read_decimal_ptr(&end, next+1);
|
|
||||||
|
|
||||||
while (start <= end)
|
|
||||||
SetBit(start++);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Intersect this CPU set with another one.
|
|
||||||
void IntersectWith(const CpuSet& other) {
|
|
||||||
for (size_t nn = 0; nn < kMaskWordCount; ++nn)
|
|
||||||
mask_[nn] &= other.mask_[nn];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the number of CPUs in this set.
|
|
||||||
int GetCount() {
|
|
||||||
int result = 0;
|
|
||||||
for (size_t nn = 0; nn < kMaskWordCount; ++nn) {
|
|
||||||
result += __builtin_popcount(mask_[nn]);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void SetBit(uintptr_t index) {
|
|
||||||
size_t nn = static_cast<size_t>(index);
|
|
||||||
if (nn < kMaxCpus)
|
|
||||||
mask_[nn / kMaskWordBits] |= (1U << (nn % kMaskWordBits));
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef uint32_t MaskWordType;
|
|
||||||
static const size_t kMaskWordBits = 8*sizeof(MaskWordType);
|
|
||||||
static const size_t kMaskWordCount =
|
|
||||||
(kMaxCpus + kMaskWordBits - 1) / kMaskWordBits;
|
|
||||||
|
|
||||||
MaskWordType mask_[kMaskWordCount];
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_CPU_SET_H_
|
|
||||||
|
|
@ -1,106 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for enumerating a directory without using diropen/readdir or other
|
|
||||||
// functions which may allocate memory.
|
|
||||||
class DirectoryReader {
|
|
||||||
public:
|
|
||||||
DirectoryReader(int fd)
|
|
||||||
: fd_(fd),
|
|
||||||
buf_used_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the next entry from the directory
|
|
||||||
// name: (output) the NUL terminated entry name
|
|
||||||
//
|
|
||||||
// Returns true iff successful (false on EOF).
|
|
||||||
//
|
|
||||||
// After calling this, one must call |PopEntry| otherwise you'll get the same
|
|
||||||
// entry over and over.
|
|
||||||
bool GetNextEntry(const char** name) {
|
|
||||||
struct kernel_dirent* const dent =
|
|
||||||
reinterpret_cast<kernel_dirent*>(buf_);
|
|
||||||
|
|
||||||
if (buf_used_ == 0) {
|
|
||||||
// need to read more entries.
|
|
||||||
const int n = sys_getdents(fd_, dent, sizeof(buf_));
|
|
||||||
if (n < 0) {
|
|
||||||
return false;
|
|
||||||
} else if (n == 0) {
|
|
||||||
hit_eof_ = true;
|
|
||||||
} else {
|
|
||||||
buf_used_ += n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buf_used_ == 0 && hit_eof_)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
assert(buf_used_ > 0);
|
|
||||||
|
|
||||||
*name = dent->d_name;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void PopEntry() {
|
|
||||||
if (!buf_used_)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const struct kernel_dirent* const dent =
|
|
||||||
reinterpret_cast<kernel_dirent*>(buf_);
|
|
||||||
|
|
||||||
buf_used_ -= dent->d_reclen;
|
|
||||||
my_memmove(buf_, buf_ + dent->d_reclen, buf_used_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const int fd_;
|
|
||||||
bool hit_eof_;
|
|
||||||
unsigned buf_used_;
|
|
||||||
uint8_t buf_[sizeof(struct kernel_dirent) + NAME_MAX + 1];
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for reading a file, line by line, without using fopen/fgets or other
|
|
||||||
// functions which may allocate memory.
|
|
||||||
class LineReader {
|
|
||||||
public:
|
|
||||||
LineReader(int fd)
|
|
||||||
: fd_(fd),
|
|
||||||
hit_eof_(false),
|
|
||||||
buf_used_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// The maximum length of a line.
|
|
||||||
static const size_t kMaxLineLen = 512;
|
|
||||||
|
|
||||||
// Return the next line from the file.
|
|
||||||
// line: (output) a pointer to the start of the line. The line is NUL
|
|
||||||
// terminated.
|
|
||||||
// len: (output) the length of the line (not inc the NUL byte)
|
|
||||||
//
|
|
||||||
// Returns true iff successful (false on EOF).
|
|
||||||
//
|
|
||||||
// One must call |PopLine| after this function, otherwise you'll continue to
|
|
||||||
// get the same line over and over.
|
|
||||||
bool GetNextLine(const char **line, unsigned *len) {
|
|
||||||
for (;;) {
|
|
||||||
if (buf_used_ == 0 && hit_eof_)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < buf_used_; ++i) {
|
|
||||||
if (buf_[i] == '\n' || buf_[i] == 0) {
|
|
||||||
buf_[i] = 0;
|
|
||||||
*len = i;
|
|
||||||
*line = buf_;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buf_used_ == sizeof(buf_)) {
|
|
||||||
// we scanned the whole buffer and didn't find an end-of-line marker.
|
|
||||||
// This line is too long to process.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We didn't find any end-of-line terminators in the buffer. However, if
|
|
||||||
// this is the last line in the file it might not have one:
|
|
||||||
if (hit_eof_) {
|
|
||||||
assert(buf_used_);
|
|
||||||
// There's room for the NUL because of the buf_used_ == sizeof(buf_)
|
|
||||||
// check above.
|
|
||||||
buf_[buf_used_] = 0;
|
|
||||||
*len = buf_used_;
|
|
||||||
buf_used_ += 1; // since we appended the NUL.
|
|
||||||
*line = buf_;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise, we should pull in more data from the file
|
|
||||||
const ssize_t n = sys_read(fd_, buf_ + buf_used_,
|
|
||||||
sizeof(buf_) - buf_used_);
|
|
||||||
if (n < 0) {
|
|
||||||
return false;
|
|
||||||
} else if (n == 0) {
|
|
||||||
hit_eof_ = true;
|
|
||||||
} else {
|
|
||||||
buf_used_ += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// At this point, we have either set the hit_eof_ flag, or we have more
|
|
||||||
// data to process...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void PopLine(unsigned len) {
|
|
||||||
// len doesn't include the NUL byte at the end.
|
|
||||||
|
|
||||||
assert(buf_used_ >= len + 1);
|
|
||||||
buf_used_ -= len + 1;
|
|
||||||
my_memmove(buf_, buf_ + len + 1, buf_used_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const int fd_;
|
|
||||||
|
|
||||||
bool hit_eof_;
|
|
||||||
unsigned buf_used_;
|
|
||||||
char buf_[kMaxLineLen];
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
|
|
||||||
|
|
@ -1,125 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_core_dumper.h: Define the google_breakpad::LinuxCoreDumper
|
|
||||||
// class, which is derived from google_breakpad::LinuxDumper to extract
|
|
||||||
// information from a crashed process via its core dump and proc files.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_CORE_DUMPER_H_
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
#include "common/linux/elf_core_dump.h"
|
|
||||||
#include "common/linux/memory_mapped_file.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class LinuxCoreDumper : public LinuxDumper {
|
|
||||||
public:
|
|
||||||
// Constructs a dumper for extracting information of a given process
|
|
||||||
// with a process ID of |pid| via its core dump file at |core_path| and
|
|
||||||
// its proc files at |procfs_path|. If |procfs_path| is a copy of
|
|
||||||
// /proc/<pid>, it should contain the following files:
|
|
||||||
// auxv, cmdline, environ, exe, maps, status
|
|
||||||
// See LinuxDumper for the purpose of |root_prefix|.
|
|
||||||
LinuxCoreDumper(pid_t pid, const char* core_path, const char* procfs_path,
|
|
||||||
const char* root_prefix = "");
|
|
||||||
|
|
||||||
// Implements LinuxDumper::BuildProcPath().
|
|
||||||
// Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).
|
|
||||||
// |path| is a character array of at least NAME_MAX bytes to return the
|
|
||||||
// result.|node| is the final node without any slashes. Return true on
|
|
||||||
// success.
|
|
||||||
//
|
|
||||||
// As this dumper performs a post-mortem dump and makes use of a copy
|
|
||||||
// of the proc files of the crashed process, this derived method does
|
|
||||||
// not actually make use of |pid| and always returns a subpath of
|
|
||||||
// |procfs_path_| regardless of whether |pid| corresponds to the main
|
|
||||||
// process or a thread of the process, i.e. assuming both the main process
|
|
||||||
// and its threads have the following proc files with the same content:
|
|
||||||
// auxv, cmdline, environ, exe, maps, status
|
|
||||||
virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::CopyFromProcess().
|
|
||||||
// Copies content of |length| bytes from a given process |child|,
|
|
||||||
// starting from |src|, into |dest|. This method extracts the content
|
|
||||||
// the core dump and fills |dest| with a sequence of marker bytes
|
|
||||||
// if the expected data is not found in the core dump. Returns true if
|
|
||||||
// the expected data is found in the core dump.
|
|
||||||
virtual bool CopyFromProcess(void* dest, pid_t child, const void* src,
|
|
||||||
size_t length);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::GetThreadInfoByIndex().
|
|
||||||
// Reads information about the |index|-th thread of |threads_|.
|
|
||||||
// Returns true on success. One must have called |ThreadsSuspend| first.
|
|
||||||
virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::IsPostMortem().
|
|
||||||
// Always returns true to indicate that this dumper performs a
|
|
||||||
// post-mortem dump of a crashed process via a core dump file.
|
|
||||||
virtual bool IsPostMortem() const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsSuspend().
|
|
||||||
// As the dumper performs a post-mortem dump via a core dump file,
|
|
||||||
// there is no threads to suspend. This method does nothing and
|
|
||||||
// always returns true.
|
|
||||||
virtual bool ThreadsSuspend();
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsResume().
|
|
||||||
// As the dumper performs a post-mortem dump via a core dump file,
|
|
||||||
// there is no threads to resume. This method does nothing and
|
|
||||||
// always returns true.
|
|
||||||
virtual bool ThreadsResume();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// Implements LinuxDumper::EnumerateThreads().
|
|
||||||
// Enumerates all threads of the given process into |threads_|.
|
|
||||||
virtual bool EnumerateThreads();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Path of the core dump file.
|
|
||||||
const char* core_path_;
|
|
||||||
|
|
||||||
// Path of the directory containing the proc files of the given process,
|
|
||||||
// which is usually a copy of /proc/<pid>.
|
|
||||||
const char* procfs_path_;
|
|
||||||
|
|
||||||
// Memory-mapped core dump file at |core_path_|.
|
|
||||||
MemoryMappedFile mapped_core_file_;
|
|
||||||
|
|
||||||
// Content of the core dump file.
|
|
||||||
ElfCoreDump core_;
|
|
||||||
|
|
||||||
// Thread info found in the core dump file.
|
|
||||||
wasteful_vector<ThreadInfo> thread_infos_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_LINUX_CORE_DUMPER_H_
|
|
||||||
|
|
@ -1,326 +0,0 @@
|
||||||
// Copyright (c) 2010, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_dumper.h: Define the google_breakpad::LinuxDumper class, which
|
|
||||||
// is a base class for extracting information of a crashed process. It
|
|
||||||
// was originally a complete implementation using the ptrace API, but
|
|
||||||
// has been refactored to allow derived implementations supporting both
|
|
||||||
// ptrace and core dump. A portion of the original implementation is now
|
|
||||||
// in google_breakpad::LinuxPtraceDumper (see linux_ptrace_dumper.h for
|
|
||||||
// details).
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <elf.h>
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
#include <link.h>
|
|
||||||
#endif
|
|
||||||
#include <linux/limits.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/user.h>
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "client/linux/dump_writer_common/mapping_info.h"
|
|
||||||
#include "client/linux/dump_writer_common/thread_info.h"
|
|
||||||
#include "common/linux/file_id.h"
|
|
||||||
#include "common/memory_allocator.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Typedef for our parsing of the auxv variables in /proc/pid/auxv.
|
|
||||||
#if defined(__i386) || defined(__ARM_EABI__) || \
|
|
||||||
(defined(__mips__) && _MIPS_SIM == _ABIO32)
|
|
||||||
typedef Elf32_auxv_t elf_aux_entry;
|
|
||||||
#elif defined(__x86_64) || defined(__aarch64__) || \
|
|
||||||
(defined(__mips__) && _MIPS_SIM != _ABIO32)
|
|
||||||
typedef Elf64_auxv_t elf_aux_entry;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef __typeof__(((elf_aux_entry*) 0)->a_un.a_val) elf_aux_val_t;
|
|
||||||
|
|
||||||
// When we find the VDSO mapping in the process's address space, this
|
|
||||||
// is the name we use for it when writing it to the minidump.
|
|
||||||
// This should always be less than NAME_MAX!
|
|
||||||
const char kLinuxGateLibraryName[] = "linux-gate.so";
|
|
||||||
|
|
||||||
class LinuxDumper {
|
|
||||||
public:
|
|
||||||
// The |root_prefix| is prepended to mapping paths before opening them, which
|
|
||||||
// is useful if the crash originates from a chroot.
|
|
||||||
explicit LinuxDumper(pid_t pid, const char* root_prefix = "");
|
|
||||||
|
|
||||||
virtual ~LinuxDumper();
|
|
||||||
|
|
||||||
// Parse the data for |threads| and |mappings|.
|
|
||||||
virtual bool Init();
|
|
||||||
|
|
||||||
// Take any actions that could not be taken in Init(). LateInit() is
|
|
||||||
// called after all other caller's initialization is complete, and in
|
|
||||||
// particular after it has called ThreadsSuspend(), so that ptrace is
|
|
||||||
// available.
|
|
||||||
virtual bool LateInit();
|
|
||||||
|
|
||||||
// Return true if the dumper performs a post-mortem dump.
|
|
||||||
virtual bool IsPostMortem() const = 0;
|
|
||||||
|
|
||||||
// Suspend/resume all threads in the given process.
|
|
||||||
virtual bool ThreadsSuspend() = 0;
|
|
||||||
virtual bool ThreadsResume() = 0;
|
|
||||||
|
|
||||||
// Read information about the |index|-th thread of |threads_|.
|
|
||||||
// Returns true on success. One must have called |ThreadsSuspend| first.
|
|
||||||
virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info) = 0;
|
|
||||||
|
|
||||||
size_t GetMainThreadIndex() const {
|
|
||||||
for (size_t i = 0; i < threads_.size(); ++i) {
|
|
||||||
if (threads_[i] == pid_) return i;
|
|
||||||
}
|
|
||||||
return -1u;
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are only valid after a call to |Init|.
|
|
||||||
const wasteful_vector<pid_t> &threads() { return threads_; }
|
|
||||||
const wasteful_vector<MappingInfo*> &mappings() { return mappings_; }
|
|
||||||
const MappingInfo* FindMapping(const void* address) const;
|
|
||||||
// Find the mapping which the given memory address falls in. Unlike
|
|
||||||
// FindMapping, this method uses the unadjusted mapping address
|
|
||||||
// ranges from the kernel, rather than the ranges that have had the
|
|
||||||
// load bias applied.
|
|
||||||
const MappingInfo* FindMappingNoBias(uintptr_t address) const;
|
|
||||||
const wasteful_vector<elf_aux_val_t>& auxv() { return auxv_; }
|
|
||||||
|
|
||||||
// Find a block of memory to take as the stack given the top of stack pointer.
|
|
||||||
// stack: (output) the lowest address in the memory area
|
|
||||||
// stack_len: (output) the length of the memory area
|
|
||||||
// stack_top: the current top of the stack
|
|
||||||
bool GetStackInfo(const void** stack, size_t* stack_len, uintptr_t stack_top);
|
|
||||||
|
|
||||||
// Sanitize a copy of the stack by overwriting words that are not
|
|
||||||
// pointers with a sentinel (0x0defaced).
|
|
||||||
// stack_copy: a copy of the stack to sanitize. |stack_copy| might
|
|
||||||
// not be word aligned, but it represents word aligned
|
|
||||||
// data copied from another location.
|
|
||||||
// stack_len: the length of the allocation pointed to by |stack_copy|.
|
|
||||||
// stack_pointer: the address of the stack pointer (used to locate
|
|
||||||
// the stack mapping, as an optimization).
|
|
||||||
// sp_offset: the offset relative to stack_copy that reflects the
|
|
||||||
// current value of the stack pointer.
|
|
||||||
void SanitizeStackCopy(uint8_t* stack_copy, size_t stack_len,
|
|
||||||
uintptr_t stack_pointer, uintptr_t sp_offset);
|
|
||||||
|
|
||||||
// Test whether |stack_copy| contains a pointer-aligned word that
|
|
||||||
// could be an address within a given mapping.
|
|
||||||
// stack_copy: a copy of the stack to check. |stack_copy| might
|
|
||||||
// not be word aligned, but it represents word aligned
|
|
||||||
// data copied from another location.
|
|
||||||
// stack_len: the length of the allocation pointed to by |stack_copy|.
|
|
||||||
// sp_offset: the offset relative to stack_copy that reflects the
|
|
||||||
// current value of the stack pointer.
|
|
||||||
// mapping: the mapping against which to test stack words.
|
|
||||||
bool StackHasPointerToMapping(const uint8_t* stack_copy, size_t stack_len,
|
|
||||||
uintptr_t sp_offset,
|
|
||||||
const MappingInfo& mapping);
|
|
||||||
|
|
||||||
PageAllocator* allocator() { return &allocator_; }
|
|
||||||
|
|
||||||
// Copy content of |length| bytes from a given process |child|,
|
|
||||||
// starting from |src|, into |dest|. Returns true on success.
|
|
||||||
virtual bool CopyFromProcess(void* dest, pid_t child, const void* src,
|
|
||||||
size_t length) = 0;
|
|
||||||
|
|
||||||
// Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).
|
|
||||||
// |path| is a character array of at least NAME_MAX bytes to return the
|
|
||||||
// result.|node| is the final node without any slashes. Returns true on
|
|
||||||
// success.
|
|
||||||
virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const = 0;
|
|
||||||
|
|
||||||
// Generate a File ID from the .text section of a mapped entry.
|
|
||||||
// If not a member, mapping_id is ignored. This method can also manipulate the
|
|
||||||
// |mapping|.name to truncate "(deleted)" from the file name if necessary.
|
|
||||||
bool ElfFileIdentifierForMapping(const MappingInfo& mapping,
|
|
||||||
bool member,
|
|
||||||
unsigned int mapping_id,
|
|
||||||
wasteful_vector<uint8_t>& identifier);
|
|
||||||
|
|
||||||
void SetCrashInfoFromSigInfo(const siginfo_t& siginfo);
|
|
||||||
|
|
||||||
uintptr_t crash_address() const { return crash_address_; }
|
|
||||||
void set_crash_address(uintptr_t crash_address) {
|
|
||||||
crash_address_ = crash_address;
|
|
||||||
}
|
|
||||||
|
|
||||||
int crash_signal() const { return crash_signal_; }
|
|
||||||
void set_crash_signal(int crash_signal) { crash_signal_ = crash_signal; }
|
|
||||||
const char* GetCrashSignalString() const;
|
|
||||||
|
|
||||||
void set_crash_signal_code(int code) { crash_signal_code_ = code; }
|
|
||||||
int crash_signal_code() const { return crash_signal_code_; }
|
|
||||||
|
|
||||||
void set_crash_exception_info(const std::vector<uint64_t>& exception_info) {
|
|
||||||
assert(exception_info.size() <= MD_EXCEPTION_MAXIMUM_PARAMETERS);
|
|
||||||
crash_exception_info_ = exception_info;
|
|
||||||
}
|
|
||||||
const std::vector<uint64_t>& crash_exception_info() const {
|
|
||||||
return crash_exception_info_;
|
|
||||||
}
|
|
||||||
|
|
||||||
pid_t crash_thread() const { return crash_thread_; }
|
|
||||||
void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; }
|
|
||||||
|
|
||||||
// Concatenates the |root_prefix_| and |mapping| path. Writes into |path| and
|
|
||||||
// returns true unless the string is too long.
|
|
||||||
bool GetMappingAbsolutePath(const MappingInfo& mapping,
|
|
||||||
char path[PATH_MAX]) const;
|
|
||||||
|
|
||||||
// Extracts the effective path and file name of from |mapping|. In most cases
|
|
||||||
// the effective name/path are just the mapping's path and basename. In some
|
|
||||||
// other cases, however, a library can be mapped from an archive (e.g., when
|
|
||||||
// loading .so libs from an apk on Android) and this method is able to
|
|
||||||
// reconstruct the original file name.
|
|
||||||
void GetMappingEffectiveNameAndPath(const MappingInfo& mapping,
|
|
||||||
char* file_path,
|
|
||||||
size_t file_path_size,
|
|
||||||
char* file_name,
|
|
||||||
size_t file_name_size);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
bool ReadAuxv();
|
|
||||||
|
|
||||||
virtual bool EnumerateMappings();
|
|
||||||
|
|
||||||
virtual bool EnumerateThreads() = 0;
|
|
||||||
|
|
||||||
// For the case where a running program has been deleted, it'll show up in
|
|
||||||
// /proc/pid/maps as "/path/to/program (deleted)". If this is the case, then
|
|
||||||
// see if '/path/to/program (deleted)' matches /proc/pid/exe and return
|
|
||||||
// /proc/pid/exe in |path| so ELF identifier generation works correctly. This
|
|
||||||
// also checks to see if '/path/to/program (deleted)' exists, so it does not
|
|
||||||
// get fooled by a poorly named binary.
|
|
||||||
// For programs that don't end with ' (deleted)', this is a no-op.
|
|
||||||
// This assumes |path| is a buffer with length NAME_MAX.
|
|
||||||
// Returns true if |path| is modified.
|
|
||||||
bool HandleDeletedFileInMapping(char* path) const;
|
|
||||||
|
|
||||||
// ID of the crashed process.
|
|
||||||
const pid_t pid_;
|
|
||||||
|
|
||||||
// Path of the root directory to which mapping paths are relative.
|
|
||||||
const char* const root_prefix_;
|
|
||||||
|
|
||||||
// Virtual address at which the process crashed.
|
|
||||||
uintptr_t crash_address_;
|
|
||||||
|
|
||||||
// Signal that terminated the crashed process.
|
|
||||||
int crash_signal_;
|
|
||||||
|
|
||||||
// The code associated with |crash_signal_|.
|
|
||||||
int crash_signal_code_;
|
|
||||||
|
|
||||||
// The additional fields associated with |crash_signal_|.
|
|
||||||
std::vector<uint64_t> crash_exception_info_;
|
|
||||||
|
|
||||||
// ID of the crashed thread.
|
|
||||||
pid_t crash_thread_;
|
|
||||||
|
|
||||||
mutable PageAllocator allocator_;
|
|
||||||
|
|
||||||
// IDs of all the threads.
|
|
||||||
wasteful_vector<pid_t> threads_;
|
|
||||||
|
|
||||||
// Info from /proc/<pid>/maps.
|
|
||||||
wasteful_vector<MappingInfo*> mappings_;
|
|
||||||
|
|
||||||
// Info from /proc/<pid>/auxv
|
|
||||||
wasteful_vector<elf_aux_val_t> auxv_;
|
|
||||||
|
|
||||||
#if defined(__ANDROID__)
|
|
||||||
private:
|
|
||||||
// Android M and later support packed ELF relocations in shared libraries.
|
|
||||||
// Packing relocations changes the vaddr of the LOAD segments, such that
|
|
||||||
// the effective load bias is no longer the same as the start address of
|
|
||||||
// the memory mapping containing the executable parts of the library. The
|
|
||||||
// packing is applied to the stripped library run on the target, but not to
|
|
||||||
// any other library, and in particular not to the library used to generate
|
|
||||||
// breakpad symbols. As a result, we need to adjust the |start_addr| for
|
|
||||||
// any mapping that results from a shared library that contains Android
|
|
||||||
// packed relocations, so that it properly represents the effective library
|
|
||||||
// load bias. The following functions support this adjustment.
|
|
||||||
|
|
||||||
// Check that a given mapping at |start_addr| is for an ELF shared library.
|
|
||||||
// If it is, place the ELF header in |ehdr| and return true.
|
|
||||||
// The first LOAD segment in an ELF shared library has offset zero, so the
|
|
||||||
// ELF file header is at the start of this map entry, and in already mapped
|
|
||||||
// memory.
|
|
||||||
bool GetLoadedElfHeader(uintptr_t start_addr, ElfW(Ehdr)* ehdr);
|
|
||||||
|
|
||||||
// For the ELF file mapped at |start_addr|, iterate ELF program headers to
|
|
||||||
// find the min vaddr of all program header LOAD segments, the vaddr for
|
|
||||||
// the DYNAMIC segment, and a count of DYNAMIC entries. Return values in
|
|
||||||
// |min_vaddr_ptr|, |dyn_vaddr_ptr|, and |dyn_count_ptr|.
|
|
||||||
// The program header table is also in already mapped memory.
|
|
||||||
void ParseLoadedElfProgramHeaders(ElfW(Ehdr)* ehdr,
|
|
||||||
uintptr_t start_addr,
|
|
||||||
uintptr_t* min_vaddr_ptr,
|
|
||||||
uintptr_t* dyn_vaddr_ptr,
|
|
||||||
size_t* dyn_count_ptr);
|
|
||||||
|
|
||||||
// Search the DYNAMIC tags for the ELF file with the given |load_bias|, and
|
|
||||||
// return true if the tags indicate that the file contains Android packed
|
|
||||||
// relocations. Dynamic tags are found at |dyn_vaddr| past the |load_bias|.
|
|
||||||
bool HasAndroidPackedRelocations(uintptr_t load_bias,
|
|
||||||
uintptr_t dyn_vaddr,
|
|
||||||
size_t dyn_count);
|
|
||||||
|
|
||||||
// If the ELF file mapped at |start_addr| contained Android packed
|
|
||||||
// relocations, return the load bias that the system linker (or Chromium
|
|
||||||
// crazy linker) will have used. If the file did not contain Android
|
|
||||||
// packed relocations, returns |start_addr|, indicating that no adjustment
|
|
||||||
// is necessary.
|
|
||||||
// The effective load bias is |start_addr| adjusted downwards by the
|
|
||||||
// min vaddr in the library LOAD segments.
|
|
||||||
uintptr_t GetEffectiveLoadBias(ElfW(Ehdr)* ehdr, uintptr_t start_addr);
|
|
||||||
|
|
||||||
// Called from LateInit(). Iterates |mappings_| and rewrites the |start_addr|
|
|
||||||
// field of any that represent ELF shared libraries with Android packed
|
|
||||||
// relocations, so that |start_addr| is the load bias that the system linker
|
|
||||||
// (or Chromium crazy linker) used. This value matches the addresses produced
|
|
||||||
// when the non-relocation-packed library is used for breakpad symbol
|
|
||||||
// generation.
|
|
||||||
void LatePostprocessMappings();
|
|
||||||
#endif // __ANDROID__
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_
|
|
||||||
|
|
@ -1,101 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// linux_ptrace_dumper.h: Define the google_breakpad::LinuxPtraceDumper
|
|
||||||
// class, which is derived from google_breakpad::LinuxDumper to extract
|
|
||||||
// information from a crashed process via ptrace.
|
|
||||||
// This class was originally splitted from google_breakpad::LinuxDumper.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_PTRACE_DUMPER_H_
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class LinuxPtraceDumper : public LinuxDumper {
|
|
||||||
public:
|
|
||||||
// Constructs a dumper for extracting information of a given process
|
|
||||||
// with a process ID of |pid|.
|
|
||||||
explicit LinuxPtraceDumper(pid_t pid);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::BuildProcPath().
|
|
||||||
// Builds a proc path for a certain pid for a node (/proc/<pid>/<node>).
|
|
||||||
// |path| is a character array of at least NAME_MAX bytes to return the
|
|
||||||
// result. |node| is the final node without any slashes. Returns true on
|
|
||||||
// success.
|
|
||||||
virtual bool BuildProcPath(char* path, pid_t pid, const char* node) const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::CopyFromProcess().
|
|
||||||
// Copies content of |length| bytes from a given process |child|,
|
|
||||||
// starting from |src|, into |dest|. This method uses ptrace to extract
|
|
||||||
// the content from the target process. Always returns true.
|
|
||||||
virtual bool CopyFromProcess(void* dest, pid_t child, const void* src,
|
|
||||||
size_t length);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::GetThreadInfoByIndex().
|
|
||||||
// Reads information about the |index|-th thread of |threads_|.
|
|
||||||
// Returns true on success. One must have called |ThreadsSuspend| first.
|
|
||||||
virtual bool GetThreadInfoByIndex(size_t index, ThreadInfo* info);
|
|
||||||
|
|
||||||
// Implements LinuxDumper::IsPostMortem().
|
|
||||||
// Always returns false to indicate this dumper performs a dump of
|
|
||||||
// a crashed process via ptrace.
|
|
||||||
virtual bool IsPostMortem() const;
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsSuspend().
|
|
||||||
// Suspends all threads in the given process. Returns true on success.
|
|
||||||
virtual bool ThreadsSuspend();
|
|
||||||
|
|
||||||
// Implements LinuxDumper::ThreadsResume().
|
|
||||||
// Resumes all threads in the given process. Returns true on success.
|
|
||||||
virtual bool ThreadsResume();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// Implements LinuxDumper::EnumerateThreads().
|
|
||||||
// Enumerates all threads of the given process into |threads_|.
|
|
||||||
virtual bool EnumerateThreads();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Set to true if all threads of the crashed process are suspended.
|
|
||||||
bool threads_suspended_;
|
|
||||||
|
|
||||||
// Read the tracee's registers on kernel with PTRACE_GETREGSET support.
|
|
||||||
// Returns false if PTRACE_GETREGSET is not defined.
|
|
||||||
// Returns true on success.
|
|
||||||
bool ReadRegisterSet(ThreadInfo* info, pid_t tid);
|
|
||||||
|
|
||||||
// Read the tracee's registers on kernel with PTRACE_GETREGS support.
|
|
||||||
// Returns true on success.
|
|
||||||
bool ReadRegisters(ThreadInfo* info, pid_t tid);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_HANDLER_LINUX_PTRACE_DUMPER_H_
|
|
||||||
|
|
@ -1,142 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/ucontext.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/linux_dumper.h"
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class ExceptionHandler;
|
|
||||||
|
|
||||||
#if defined(__aarch64__)
|
|
||||||
typedef struct fpsimd_context fpstate_t;
|
|
||||||
#elif !defined(__ARM_EABI__) && !defined(__mips__)
|
|
||||||
typedef struct _libc_fpstate fpstate_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// These entries store a list of memory regions that the client wants included
|
|
||||||
// in the minidump.
|
|
||||||
struct AppMemory {
|
|
||||||
void* ptr;
|
|
||||||
size_t length;
|
|
||||||
|
|
||||||
bool operator==(const struct AppMemory& other) const {
|
|
||||||
return ptr == other.ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const void* other) const {
|
|
||||||
return ptr == other;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
typedef std::list<AppMemory> AppMemoryList;
|
|
||||||
|
|
||||||
// Writes a minidump to the filesystem. These functions do not malloc nor use
|
|
||||||
// libc functions which may. Thus, it can be used in contexts where the state
|
|
||||||
// of the heap may be corrupt.
|
|
||||||
// minidump_path: the path to the file to write to. This is opened O_EXCL and
|
|
||||||
// fails open fails.
|
|
||||||
// crashing_process: the pid of the crashing process. This must be trusted.
|
|
||||||
// blob: a blob of data from the crashing process. See exception_handler.h
|
|
||||||
// blob_size: the length of |blob|, in bytes
|
|
||||||
//
|
|
||||||
// Returns true iff successful.
|
|
||||||
bool WriteMinidump(const char* minidump_path, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
bool skip_stacks_if_mapping_unreferenced = false,
|
|
||||||
uintptr_t principal_mapping_address = 0,
|
|
||||||
bool sanitize_stacks = false);
|
|
||||||
// Same as above but takes an open file descriptor instead of a path.
|
|
||||||
bool WriteMinidump(int minidump_fd, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
bool skip_stacks_if_mapping_unreferenced = false,
|
|
||||||
uintptr_t principal_mapping_address = 0,
|
|
||||||
bool sanitize_stacks = false);
|
|
||||||
|
|
||||||
// Alternate form of WriteMinidump() that works with processes that
|
|
||||||
// are not expected to have crashed. If |process_blamed_thread| is
|
|
||||||
// meaningful, it will be the one from which a crash signature is
|
|
||||||
// extracted. It is not expected that this function will be called
|
|
||||||
// from a compromised context, but it is safe to do so.
|
|
||||||
bool WriteMinidump(const char* minidump_path, pid_t process,
|
|
||||||
pid_t process_blamed_thread);
|
|
||||||
|
|
||||||
// These overloads also allow passing a list of known mappings and
|
|
||||||
// a list of additional memory regions to be included in the minidump.
|
|
||||||
bool WriteMinidump(const char* minidump_path, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata,
|
|
||||||
bool skip_stacks_if_mapping_unreferenced = false,
|
|
||||||
uintptr_t principal_mapping_address = 0,
|
|
||||||
bool sanitize_stacks = false);
|
|
||||||
bool WriteMinidump(int minidump_fd, pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata,
|
|
||||||
bool skip_stacks_if_mapping_unreferenced = false,
|
|
||||||
uintptr_t principal_mapping_address = 0,
|
|
||||||
bool sanitize_stacks = false);
|
|
||||||
|
|
||||||
// These overloads also allow passing a file size limit for the minidump.
|
|
||||||
bool WriteMinidump(const char* minidump_path, off_t minidump_size_limit,
|
|
||||||
pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata,
|
|
||||||
bool skip_stacks_if_mapping_unreferenced = false,
|
|
||||||
uintptr_t principal_mapping_address = 0,
|
|
||||||
bool sanitize_stacks = false);
|
|
||||||
bool WriteMinidump(int minidump_fd, off_t minidump_size_limit,
|
|
||||||
pid_t crashing_process,
|
|
||||||
const void* blob, size_t blob_size,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata,
|
|
||||||
bool skip_stacks_if_mapping_unreferenced = false,
|
|
||||||
uintptr_t principal_mapping_address = 0,
|
|
||||||
bool sanitize_stacks = false);
|
|
||||||
|
|
||||||
bool WriteMinidump(const char* filename,
|
|
||||||
const MappingList& mappings,
|
|
||||||
const AppMemoryList& appdata,
|
|
||||||
LinuxDumper* dumper);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// minidump_writer_unittest_utils.h:
|
|
||||||
// Shared routines used by unittests under client/linux/minidump_writer.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_UNITTEST_UTILS_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_UNITTEST_UTILS_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Returns the full path to linux_dumper_unittest_helper. The full path is
|
|
||||||
// discovered either by using the environment variable "bindir" or by using
|
|
||||||
// the location of the main module of the currently running process.
|
|
||||||
string GetHelperBinary();
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_UNITTEST_UTILS_H_
|
|
||||||
|
|
@ -1,130 +0,0 @@
|
||||||
// Copyright (c) 2013, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_
|
|
||||||
#define CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "client/linux/minidump_writer/line_reader.h"
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for reading /proc/cpuinfo without using fopen/fgets or other
|
|
||||||
// functions which may allocate memory.
|
|
||||||
class ProcCpuInfoReader {
|
|
||||||
public:
|
|
||||||
ProcCpuInfoReader(int fd)
|
|
||||||
: line_reader_(fd), pop_count_(-1) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the next field name, or NULL in case of EOF.
|
|
||||||
// field: (output) Pointer to zero-terminated field name.
|
|
||||||
// Returns true on success, or false on EOF or error (line too long).
|
|
||||||
bool GetNextField(const char** field) {
|
|
||||||
for (;;) {
|
|
||||||
const char* line;
|
|
||||||
unsigned line_len;
|
|
||||||
|
|
||||||
// Try to read next line.
|
|
||||||
if (pop_count_ >= 0) {
|
|
||||||
line_reader_.PopLine(pop_count_);
|
|
||||||
pop_count_ = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!line_reader_.GetNextLine(&line, &line_len))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
pop_count_ = static_cast<int>(line_len);
|
|
||||||
|
|
||||||
const char* line_end = line + line_len;
|
|
||||||
|
|
||||||
// Expected format: <field-name> <space>+ ':' <space> <value>
|
|
||||||
// Note that:
|
|
||||||
// - empty lines happen.
|
|
||||||
// - <field-name> can contain spaces.
|
|
||||||
// - some fields have an empty <value>
|
|
||||||
char* sep = static_cast<char*>(my_memchr(line, ':', line_len));
|
|
||||||
if (sep == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Record the value. Skip leading space after the column to get
|
|
||||||
// its start.
|
|
||||||
const char* val = sep+1;
|
|
||||||
while (val < line_end && my_isspace(*val))
|
|
||||||
val++;
|
|
||||||
|
|
||||||
value_ = val;
|
|
||||||
value_len_ = static_cast<size_t>(line_end - val);
|
|
||||||
|
|
||||||
// Remove trailing spaces before the column to properly 0-terminate
|
|
||||||
// the field name.
|
|
||||||
while (sep > line && my_isspace(sep[-1]))
|
|
||||||
sep--;
|
|
||||||
|
|
||||||
if (sep == line)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// zero-terminate field name.
|
|
||||||
*sep = '\0';
|
|
||||||
|
|
||||||
*field = line;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the field value. This must be called after a succesful
|
|
||||||
// call to GetNextField().
|
|
||||||
const char* GetValue() {
|
|
||||||
assert(value_);
|
|
||||||
return value_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Same as GetValue(), but also returns the length in characters of
|
|
||||||
// the value.
|
|
||||||
const char* GetValueAndLen(size_t* length) {
|
|
||||||
assert(value_);
|
|
||||||
*length = value_len_;
|
|
||||||
return value_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
LineReader line_reader_;
|
|
||||||
int pop_count_;
|
|
||||||
const char* value_;
|
|
||||||
size_t value_len_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_MINIDUMP_WRITER_PROC_CPUINFO_READER_H_
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
// Copyright (c) 2011 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_BASICTYPES_H_
|
|
||||||
#define COMMON_BASICTYPES_H_
|
|
||||||
|
|
||||||
// A macro to disallow the copy constructor and operator= functions
|
|
||||||
// This should be used in the private: declarations for a class
|
|
||||||
#ifndef DISALLOW_COPY_AND_ASSIGN
|
|
||||||
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
|
|
||||||
TypeName(const TypeName&); \
|
|
||||||
void operator=(const TypeName&)
|
|
||||||
#endif // DISALLOW_COPY_AND_ASSIGN
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Used to explicitly mark the return value of a function as unused. If you are
|
|
||||||
// really sure you don't want to do anything with the return value of a function
|
|
||||||
// that has been marked with __attribute__((warn_unused_result)), wrap it with
|
|
||||||
// this. Example:
|
|
||||||
//
|
|
||||||
// scoped_ptr<MyType> my_var = ...;
|
|
||||||
// if (TakeOwnership(my_var.get()) == SUCCESS)
|
|
||||||
// ignore_result(my_var.release());
|
|
||||||
//
|
|
||||||
template<typename T>
|
|
||||||
inline void ignore_result(const T&) {
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_BASICTYPES_H_
|
|
||||||
|
|
@ -1,265 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// byte_cursor.h: Classes for parsing values from a buffer of bytes.
|
|
||||||
// The ByteCursor class provides a convenient interface for reading
|
|
||||||
// fixed-size integers of arbitrary endianness, being thorough about
|
|
||||||
// checking for buffer overruns.
|
|
||||||
|
|
||||||
#ifndef COMMON_BYTE_CURSOR_H_
|
|
||||||
#define COMMON_BYTE_CURSOR_H_
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A buffer holding a series of bytes.
|
|
||||||
struct ByteBuffer {
|
|
||||||
ByteBuffer() : start(0), end(0) { }
|
|
||||||
ByteBuffer(const uint8_t *set_start, size_t set_size)
|
|
||||||
: start(set_start), end(set_start + set_size) { }
|
|
||||||
~ByteBuffer() { };
|
|
||||||
|
|
||||||
// Equality operators. Useful in unit tests, and when we're using
|
|
||||||
// ByteBuffers to refer to regions of a larger buffer.
|
|
||||||
bool operator==(const ByteBuffer &that) const {
|
|
||||||
return start == that.start && end == that.end;
|
|
||||||
}
|
|
||||||
bool operator!=(const ByteBuffer &that) const {
|
|
||||||
return start != that.start || end != that.end;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Not C++ style guide compliant, but this definitely belongs here.
|
|
||||||
size_t Size() const {
|
|
||||||
assert(start <= end);
|
|
||||||
return end - start;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint8_t *start, *end;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A cursor pointing into a ByteBuffer that can parse numbers of various
|
|
||||||
// widths and representations, strings, and data blocks, advancing through
|
|
||||||
// the buffer as it goes. All ByteCursor operations check that accesses
|
|
||||||
// haven't gone beyond the end of the enclosing ByteBuffer.
|
|
||||||
class ByteCursor {
|
|
||||||
public:
|
|
||||||
// Create a cursor reading bytes from the start of BUFFER. By default, the
|
|
||||||
// cursor reads multi-byte values in little-endian form.
|
|
||||||
ByteCursor(const ByteBuffer *buffer, bool big_endian = false)
|
|
||||||
: buffer_(buffer), here_(buffer->start),
|
|
||||||
big_endian_(big_endian), complete_(true) { }
|
|
||||||
|
|
||||||
// Accessor and setter for this cursor's endianness flag.
|
|
||||||
bool big_endian() const { return big_endian_; }
|
|
||||||
void set_big_endian(bool big_endian) { big_endian_ = big_endian; }
|
|
||||||
|
|
||||||
// Accessor and setter for this cursor's current position. The setter
|
|
||||||
// returns a reference to this cursor.
|
|
||||||
const uint8_t *here() const { return here_; }
|
|
||||||
ByteCursor &set_here(const uint8_t *here) {
|
|
||||||
assert(buffer_->start <= here && here <= buffer_->end);
|
|
||||||
here_ = here;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the number of bytes available to read at the cursor.
|
|
||||||
size_t Available() const { return size_t(buffer_->end - here_); }
|
|
||||||
|
|
||||||
// Return true if this cursor is at the end of its buffer.
|
|
||||||
bool AtEnd() const { return Available() == 0; }
|
|
||||||
|
|
||||||
// When used as a boolean value this cursor converts to true if all
|
|
||||||
// prior reads have been completed, or false if we ran off the end
|
|
||||||
// of the buffer.
|
|
||||||
operator bool() const { return complete_; }
|
|
||||||
|
|
||||||
// Read a SIZE-byte integer at this cursor, signed if IS_SIGNED is true,
|
|
||||||
// unsigned otherwise, using the cursor's established endianness, and set
|
|
||||||
// *RESULT to the number. If we read off the end of our buffer, clear
|
|
||||||
// this cursor's complete_ flag, and store a dummy value in *RESULT.
|
|
||||||
// Return a reference to this cursor.
|
|
||||||
template<typename T>
|
|
||||||
ByteCursor &Read(size_t size, bool is_signed, T *result) {
|
|
||||||
if (CheckAvailable(size)) {
|
|
||||||
T v = 0;
|
|
||||||
if (big_endian_) {
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
v = (v << 8) + here_[i];
|
|
||||||
} else {
|
|
||||||
// This loop condition looks weird, but size_t is unsigned, so
|
|
||||||
// decrementing i after it is zero yields the largest size_t value.
|
|
||||||
for (size_t i = size - 1; i < size; i--)
|
|
||||||
v = (v << 8) + here_[i];
|
|
||||||
}
|
|
||||||
if (is_signed && size < sizeof(T)) {
|
|
||||||
size_t sign_bit = (T)1 << (size * 8 - 1);
|
|
||||||
v = (v ^ sign_bit) - sign_bit;
|
|
||||||
}
|
|
||||||
here_ += size;
|
|
||||||
*result = v;
|
|
||||||
} else {
|
|
||||||
*result = (T) 0xdeadbeef;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read an integer, using the cursor's established endianness and
|
|
||||||
// *RESULT's size and signedness, and set *RESULT to the number. If we
|
|
||||||
// read off the end of our buffer, clear this cursor's complete_ flag.
|
|
||||||
// Return a reference to this cursor.
|
|
||||||
template<typename T>
|
|
||||||
ByteCursor &operator>>(T &result) {
|
|
||||||
bool T_is_signed = (T)-1 < 0;
|
|
||||||
return Read(sizeof(T), T_is_signed, &result);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy the SIZE bytes at the cursor to BUFFER, and advance this
|
|
||||||
// cursor to the end of them. If we read off the end of our buffer,
|
|
||||||
// clear this cursor's complete_ flag, and set *POINTER to NULL.
|
|
||||||
// Return a reference to this cursor.
|
|
||||||
ByteCursor &Read(uint8_t *buffer, size_t size) {
|
|
||||||
if (CheckAvailable(size)) {
|
|
||||||
memcpy(buffer, here_, size);
|
|
||||||
here_ += size;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set STR to a copy of the '\0'-terminated string at the cursor. If the
|
|
||||||
// byte buffer does not contain a terminating zero, clear this cursor's
|
|
||||||
// complete_ flag, and set STR to the empty string. Return a reference to
|
|
||||||
// this cursor.
|
|
||||||
ByteCursor &CString(string *str) {
|
|
||||||
const uint8_t *end
|
|
||||||
= static_cast<const uint8_t *>(memchr(here_, '\0', Available()));
|
|
||||||
if (end) {
|
|
||||||
str->assign(reinterpret_cast<const char *>(here_), end - here_);
|
|
||||||
here_ = end + 1;
|
|
||||||
} else {
|
|
||||||
str->clear();
|
|
||||||
here_ = buffer_->end;
|
|
||||||
complete_ = false;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Like CString(STR), but extract the string from a fixed-width buffer
|
|
||||||
// LIMIT bytes long, which may or may not contain a terminating '\0'
|
|
||||||
// byte. Specifically:
|
|
||||||
//
|
|
||||||
// - If there are not LIMIT bytes available at the cursor, clear the
|
|
||||||
// cursor's complete_ flag and set STR to the empty string.
|
|
||||||
//
|
|
||||||
// - Otherwise, if the LIMIT bytes at the cursor contain any '\0'
|
|
||||||
// characters, set *STR to a copy of the bytes before the first '\0',
|
|
||||||
// and advance the cursor by LIMIT bytes.
|
|
||||||
//
|
|
||||||
// - Otherwise, set *STR to a copy of those LIMIT bytes, and advance the
|
|
||||||
// cursor by LIMIT bytes.
|
|
||||||
ByteCursor &CString(string *str, size_t limit) {
|
|
||||||
if (CheckAvailable(limit)) {
|
|
||||||
const uint8_t *end
|
|
||||||
= static_cast<const uint8_t *>(memchr(here_, '\0', limit));
|
|
||||||
if (end)
|
|
||||||
str->assign(reinterpret_cast<const char *>(here_), end - here_);
|
|
||||||
else
|
|
||||||
str->assign(reinterpret_cast<const char *>(here_), limit);
|
|
||||||
here_ += limit;
|
|
||||||
} else {
|
|
||||||
str->clear();
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set *POINTER to point to the SIZE bytes at the cursor, and advance
|
|
||||||
// this cursor to the end of them. If SIZE is omitted, don't move the
|
|
||||||
// cursor. If we read off the end of our buffer, clear this cursor's
|
|
||||||
// complete_ flag, and set *POINTER to NULL. Return a reference to this
|
|
||||||
// cursor.
|
|
||||||
ByteCursor &PointTo(const uint8_t **pointer, size_t size = 0) {
|
|
||||||
if (CheckAvailable(size)) {
|
|
||||||
*pointer = here_;
|
|
||||||
here_ += size;
|
|
||||||
} else {
|
|
||||||
*pointer = NULL;
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip SIZE bytes at the cursor. If doing so would advance us off
|
|
||||||
// the end of our buffer, clear this cursor's complete_ flag, and
|
|
||||||
// set *POINTER to NULL. Return a reference to this cursor.
|
|
||||||
ByteCursor &Skip(size_t size) {
|
|
||||||
if (CheckAvailable(size))
|
|
||||||
here_ += size;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// If there are at least SIZE bytes available to read from the buffer,
|
|
||||||
// return true. Otherwise, set here_ to the end of the buffer, set
|
|
||||||
// complete_ to false, and return false.
|
|
||||||
bool CheckAvailable(size_t size) {
|
|
||||||
if (Available() >= size) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
here_ = buffer_->end;
|
|
||||||
complete_ = false;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The buffer we're reading bytes from.
|
|
||||||
const ByteBuffer *buffer_;
|
|
||||||
|
|
||||||
// The next byte within buffer_ that we'll read.
|
|
||||||
const uint8_t *here_;
|
|
||||||
|
|
||||||
// True if we should read numbers in big-endian form; false if we
|
|
||||||
// should read in little-endian form.
|
|
||||||
bool big_endian_;
|
|
||||||
|
|
||||||
// True if we've been able to read all we've been asked to.
|
|
||||||
bool complete_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_BYTE_CURSOR_H_
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 1991-2015 Unicode, Inc. All rights reserved.
|
|
||||||
* Distributed under the Terms of Use in
|
|
||||||
* http://www.unicode.org/copyright.html.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of the Unicode data files and any associated documentation
|
|
||||||
* (the "Data Files") or Unicode software and any associated documentation
|
|
||||||
* (the "Software") to deal in the Data Files or Software
|
|
||||||
* without restriction, including without limitation the rights to use,
|
|
||||||
* copy, modify, merge, publish, distribute, and/or sell copies of
|
|
||||||
* the Data Files or Software, and to permit persons to whom the Data Files
|
|
||||||
* or Software are furnished to do so, provided that
|
|
||||||
* (a) this copyright and permission notice appear with all copies
|
|
||||||
* of the Data Files or Software,
|
|
||||||
* (b) this copyright and permission notice appear in associated
|
|
||||||
* documentation, and
|
|
||||||
* (c) there is clear notice in each modified Data File or in the Software
|
|
||||||
* as well as in the documentation associated with the Data File(s) or
|
|
||||||
* Software that the data or software has been modified.
|
|
||||||
*
|
|
||||||
* THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
|
|
||||||
* ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
||||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
* NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
||||||
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
|
|
||||||
* NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
|
|
||||||
* DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
||||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
||||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
||||||
* PERFORMANCE OF THE DATA FILES OR SOFTWARE.
|
|
||||||
*
|
|
||||||
* Except as contained in this notice, the name of a copyright holder
|
|
||||||
* shall not be used in advertising or otherwise to promote the sale,
|
|
||||||
* use or other dealings in these Data Files or Software without prior
|
|
||||||
* written authorization of the copyright holder.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef COMMON_CONVERT_UTF_H_
|
|
||||||
#define COMMON_CONVERT_UTF_H_
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
|
||||||
|
|
||||||
Conversions between UTF32, UTF-16, and UTF-8. Header file.
|
|
||||||
|
|
||||||
Several funtions are included here, forming a complete set of
|
|
||||||
conversions between the three formats. UTF-7 is not included
|
|
||||||
here, but is handled in a separate source file.
|
|
||||||
|
|
||||||
Each of these routines takes pointers to input buffers and output
|
|
||||||
buffers. The input buffers are const.
|
|
||||||
|
|
||||||
Each routine converts the text between *sourceStart and sourceEnd,
|
|
||||||
putting the result into the buffer between *targetStart and
|
|
||||||
targetEnd. Note: the end pointers are *after* the last item: e.g.
|
|
||||||
*(sourceEnd - 1) is the last item.
|
|
||||||
|
|
||||||
The return result indicates whether the conversion was successful,
|
|
||||||
and if not, whether the problem was in the source or target buffers.
|
|
||||||
(Only the first encountered problem is indicated.)
|
|
||||||
|
|
||||||
After the conversion, *sourceStart and *targetStart are both
|
|
||||||
updated to point to the end of last text successfully converted in
|
|
||||||
the respective buffers.
|
|
||||||
|
|
||||||
Input parameters:
|
|
||||||
sourceStart - pointer to a pointer to the source buffer.
|
|
||||||
The contents of this are modified on return so that
|
|
||||||
it points at the next thing to be converted.
|
|
||||||
targetStart - similarly, pointer to pointer to the target buffer.
|
|
||||||
sourceEnd, targetEnd - respectively pointers to the ends of the
|
|
||||||
two buffers, for overflow checking only.
|
|
||||||
|
|
||||||
These conversion functions take a ConversionFlags argument. When this
|
|
||||||
flag is set to strict, both irregular sequences and isolated surrogates
|
|
||||||
will cause an error. When the flag is set to lenient, both irregular
|
|
||||||
sequences and isolated surrogates are converted.
|
|
||||||
|
|
||||||
Whether the flag is strict or lenient, all illegal sequences will cause
|
|
||||||
an error return. This includes sequences such as: <F4 90 80 80>, <C0 80>,
|
|
||||||
or <A0> in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code
|
|
||||||
must check for illegal sequences.
|
|
||||||
|
|
||||||
When the flag is set to lenient, characters over 0x10FFFF are converted
|
|
||||||
to the replacement character; otherwise (when the flag is set to strict)
|
|
||||||
they constitute an error.
|
|
||||||
|
|
||||||
Output parameters:
|
|
||||||
The value "sourceIllegal" is returned from some routines if the input
|
|
||||||
sequence is malformed. When "sourceIllegal" is returned, the source
|
|
||||||
value will point to the illegal value that caused the problem. E.g.,
|
|
||||||
in UTF-8 when a sequence is malformed, it points to the start of the
|
|
||||||
malformed sequence.
|
|
||||||
|
|
||||||
Author: Mark E. Davis, 1994.
|
|
||||||
Rev History: Rick McGowan, fixes & updates May 2001.
|
|
||||||
Fixes & updates, Sept 2001.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------
|
|
||||||
The following 4 definitions are compiler-specific.
|
|
||||||
The C standard does not guarantee that wchar_t has at least
|
|
||||||
16 bits, so wchar_t is no less portable than unsigned short!
|
|
||||||
All should be unsigned values to avoid sign extension during
|
|
||||||
bit mask & shift operations.
|
|
||||||
------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
typedef unsigned long UTF32; /* at least 32 bits */
|
|
||||||
typedef unsigned short UTF16; /* at least 16 bits */
|
|
||||||
typedef unsigned char UTF8; /* typically 8 bits */
|
|
||||||
typedef unsigned char Boolean; /* 0 or 1 */
|
|
||||||
|
|
||||||
/* Some fundamental constants */
|
|
||||||
#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD
|
|
||||||
#define UNI_MAX_BMP (UTF32)0x0000FFFF
|
|
||||||
#define UNI_MAX_UTF16 (UTF32)0x0010FFFF
|
|
||||||
#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF
|
|
||||||
#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
conversionOK, /* conversion successful */
|
|
||||||
sourceExhausted, /* partial character in source, but hit end */
|
|
||||||
targetExhausted, /* insuff. room in target for conversion */
|
|
||||||
sourceIllegal /* source sequence is illegal/malformed */
|
|
||||||
} ConversionResult;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
strictConversion = 0,
|
|
||||||
lenientConversion
|
|
||||||
} ConversionFlags;
|
|
||||||
|
|
||||||
/* This is for C++ and does no harm in C */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd,
|
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd,
|
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd,
|
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd,
|
|
||||||
UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd,
|
|
||||||
UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd,
|
|
||||||
UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags);
|
|
||||||
|
|
||||||
Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
#endif // COMMON_CONVERT_UTF_H_
|
|
||||||
|
|
@ -1,202 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// dwarf_cfi_to_module.h: Define the DwarfCFIToModule class, which
|
|
||||||
// accepts parsed DWARF call frame info and adds it to a
|
|
||||||
// google_breakpad::Module object, which can write that information to
|
|
||||||
// a Breakpad symbol file.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_DWARF_CFI_TO_MODULE_H
|
|
||||||
#define COMMON_LINUX_DWARF_CFI_TO_MODULE_H
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <set>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/module.h"
|
|
||||||
#include "common/dwarf/dwarf2reader.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
using dwarf2reader::CallFrameInfo;
|
|
||||||
using google_breakpad::Module;
|
|
||||||
using std::set;
|
|
||||||
using std::vector;
|
|
||||||
|
|
||||||
// A class that accepts parsed call frame information from the DWARF
|
|
||||||
// CFI parser and populates a google_breakpad::Module object with the
|
|
||||||
// contents.
|
|
||||||
class DwarfCFIToModule: public CallFrameInfo::Handler {
|
|
||||||
public:
|
|
||||||
|
|
||||||
// DwarfCFIToModule uses an instance of this class to report errors
|
|
||||||
// detected while converting DWARF CFI to Breakpad STACK CFI records.
|
|
||||||
class Reporter {
|
|
||||||
public:
|
|
||||||
// Create a reporter that writes messages to the standard error
|
|
||||||
// stream. FILE is the name of the file we're processing, and
|
|
||||||
// SECTION is the name of the section within that file that we're
|
|
||||||
// looking at (.debug_frame, .eh_frame, etc.).
|
|
||||||
Reporter(const string &file, const string §ion)
|
|
||||||
: file_(file), section_(section) { }
|
|
||||||
virtual ~Reporter() { }
|
|
||||||
|
|
||||||
// The DWARF CFI entry at OFFSET cites register REG, but REG is not
|
|
||||||
// covered by the vector of register names passed to the
|
|
||||||
// DwarfCFIToModule constructor, nor does it match the return
|
|
||||||
// address column number for this entry.
|
|
||||||
virtual void UnnamedRegister(size_t offset, int reg);
|
|
||||||
|
|
||||||
// The DWARF CFI entry at OFFSET says that REG is undefined, but the
|
|
||||||
// Breakpad symbol file format cannot express this.
|
|
||||||
virtual void UndefinedNotSupported(size_t offset, const string ®);
|
|
||||||
|
|
||||||
// The DWARF CFI entry at OFFSET says that REG uses a DWARF
|
|
||||||
// expression to find its value, but DwarfCFIToModule is not
|
|
||||||
// capable of translating DWARF expressions to Breakpad postfix
|
|
||||||
// expressions.
|
|
||||||
virtual void ExpressionsNotSupported(size_t offset, const string ®);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
string file_, section_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Register name tables. If TABLE is a vector returned by one of these
|
|
||||||
// functions, then TABLE[R] is the name of the register numbered R in
|
|
||||||
// DWARF call frame information.
|
|
||||||
class RegisterNames {
|
|
||||||
public:
|
|
||||||
// Intel's "x86" or IA-32.
|
|
||||||
static vector<string> I386();
|
|
||||||
|
|
||||||
// AMD x86_64, AMD64, Intel EM64T, or Intel 64
|
|
||||||
static vector<string> X86_64();
|
|
||||||
|
|
||||||
// ARM.
|
|
||||||
static vector<string> ARM();
|
|
||||||
|
|
||||||
// ARM64, aka AARCH64.
|
|
||||||
static vector<string> ARM64();
|
|
||||||
|
|
||||||
// MIPS.
|
|
||||||
static vector<string> MIPS();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Given STRINGS, an array of C strings with SIZE elements, return an
|
|
||||||
// equivalent vector<string>.
|
|
||||||
static vector<string> MakeVector(const char * const *strings, size_t size);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a handler for the dwarf2reader::CallFrameInfo parser that
|
|
||||||
// records the stack unwinding information it receives in MODULE.
|
|
||||||
//
|
|
||||||
// Use REGISTER_NAMES[I] as the name of register number I; *this
|
|
||||||
// keeps a reference to the vector, so the vector should remain
|
|
||||||
// alive for as long as the DwarfCFIToModule does.
|
|
||||||
//
|
|
||||||
// Use REPORTER for reporting problems encountered in the conversion
|
|
||||||
// process.
|
|
||||||
DwarfCFIToModule(Module *module, const vector<string> ®ister_names,
|
|
||||||
Reporter *reporter)
|
|
||||||
: module_(module), register_names_(register_names), reporter_(reporter),
|
|
||||||
entry_(NULL), return_address_(-1), cfa_name_(".cfa"), ra_name_(".ra") {
|
|
||||||
}
|
|
||||||
virtual ~DwarfCFIToModule() { delete entry_; }
|
|
||||||
|
|
||||||
virtual bool Entry(size_t offset, uint64 address, uint64 length,
|
|
||||||
uint8 version, const string &augmentation,
|
|
||||||
unsigned return_address);
|
|
||||||
virtual bool UndefinedRule(uint64 address, int reg);
|
|
||||||
virtual bool SameValueRule(uint64 address, int reg);
|
|
||||||
virtual bool OffsetRule(uint64 address, int reg,
|
|
||||||
int base_register, long offset);
|
|
||||||
virtual bool ValOffsetRule(uint64 address, int reg,
|
|
||||||
int base_register, long offset);
|
|
||||||
virtual bool RegisterRule(uint64 address, int reg, int base_register);
|
|
||||||
virtual bool ExpressionRule(uint64 address, int reg,
|
|
||||||
const string &expression);
|
|
||||||
virtual bool ValExpressionRule(uint64 address, int reg,
|
|
||||||
const string &expression);
|
|
||||||
virtual bool End();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Return the name to use for register REG.
|
|
||||||
string RegisterName(int i);
|
|
||||||
|
|
||||||
// Record RULE for register REG at ADDRESS.
|
|
||||||
void Record(Module::Address address, int reg, const string &rule);
|
|
||||||
|
|
||||||
// The module to which we should add entries.
|
|
||||||
Module *module_;
|
|
||||||
|
|
||||||
// Map from register numbers to register names.
|
|
||||||
const vector<string> ®ister_names_;
|
|
||||||
|
|
||||||
// The reporter to use to report problems.
|
|
||||||
Reporter *reporter_;
|
|
||||||
|
|
||||||
// The current entry we're constructing.
|
|
||||||
Module::StackFrameEntry *entry_;
|
|
||||||
|
|
||||||
// The section offset of the current frame description entry, for
|
|
||||||
// use in error messages.
|
|
||||||
size_t entry_offset_;
|
|
||||||
|
|
||||||
// The return address column for that entry.
|
|
||||||
unsigned return_address_;
|
|
||||||
|
|
||||||
// The names of the return address and canonical frame address. Putting
|
|
||||||
// these here instead of using string literals allows us to share their
|
|
||||||
// texts in reference-counted string implementations (all the
|
|
||||||
// popular ones). Many, many rules cite these strings.
|
|
||||||
string cfa_name_, ra_name_;
|
|
||||||
|
|
||||||
// A set of strings used by this CFI. Before storing a string in one of
|
|
||||||
// our data structures, insert it into this set, and then use the string
|
|
||||||
// from the set.
|
|
||||||
//
|
|
||||||
// Because string uses reference counting internally, simply using
|
|
||||||
// strings from this set, even if passed by value, assigned, or held
|
|
||||||
// directly in structures and containers (map<string, ...>, for example),
|
|
||||||
// causes those strings to share a single instance of each distinct piece
|
|
||||||
// of text.
|
|
||||||
set<string> common_strings_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_DWARF_CFI_TO_MODULE_H
|
|
||||||
|
|
@ -1,345 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// Add DWARF debugging information to a Breakpad symbol file. This
|
|
||||||
// file defines the DwarfCUToModule class, which accepts parsed DWARF
|
|
||||||
// data and populates a google_breakpad::Module with the results; the
|
|
||||||
// Module can then write its contents as a Breakpad symbol file.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_DWARF_CU_TO_MODULE_H__
|
|
||||||
#define COMMON_LINUX_DWARF_CU_TO_MODULE_H__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/language.h"
|
|
||||||
#include "common/module.h"
|
|
||||||
#include "common/dwarf/bytereader.h"
|
|
||||||
#include "common/dwarf/dwarf2diehandler.h"
|
|
||||||
#include "common/dwarf/dwarf2reader.h"
|
|
||||||
#include "common/scoped_ptr.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
using dwarf2reader::DwarfAttribute;
|
|
||||||
using dwarf2reader::DwarfForm;
|
|
||||||
using dwarf2reader::DwarfLanguage;
|
|
||||||
using dwarf2reader::DwarfTag;
|
|
||||||
|
|
||||||
// Populate a google_breakpad::Module with DWARF debugging information.
|
|
||||||
//
|
|
||||||
// An instance of this class can be provided as a handler to a
|
|
||||||
// dwarf2reader::DIEDispatcher, which can in turn be a handler for a
|
|
||||||
// dwarf2reader::CompilationUnit DWARF parser. The handler uses the results
|
|
||||||
// of parsing to populate a google_breakpad::Module with source file,
|
|
||||||
// function, and source line information.
|
|
||||||
class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
|
|
||||||
struct FilePrivate;
|
|
||||||
public:
|
|
||||||
// Information global to the DWARF-bearing file we are processing,
|
|
||||||
// for use by DwarfCUToModule. Each DwarfCUToModule instance deals
|
|
||||||
// with a single compilation unit within the file, but information
|
|
||||||
// global to the whole file is held here. The client is responsible
|
|
||||||
// for filling it in appropriately (except for the 'file_private'
|
|
||||||
// field, which the constructor and destructor take care of), and
|
|
||||||
// then providing it to the DwarfCUToModule instance for each
|
|
||||||
// compilation unit we process in that file. Set HANDLE_INTER_CU_REFS
|
|
||||||
// to true to handle debugging symbols with DW_FORM_ref_addr entries.
|
|
||||||
class FileContext {
|
|
||||||
public:
|
|
||||||
FileContext(const string &filename,
|
|
||||||
Module *module,
|
|
||||||
bool handle_inter_cu_refs);
|
|
||||||
~FileContext();
|
|
||||||
|
|
||||||
// Add CONTENTS of size LENGTH to the section map as NAME.
|
|
||||||
void AddSectionToSectionMap(const string& name,
|
|
||||||
const uint8_t *contents,
|
|
||||||
uint64 length);
|
|
||||||
|
|
||||||
// Clear the section map for testing.
|
|
||||||
void ClearSectionMapForTest();
|
|
||||||
|
|
||||||
const dwarf2reader::SectionMap& section_map() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class DwarfCUToModule;
|
|
||||||
|
|
||||||
// Clears all the Specifications if HANDLE_INTER_CU_REFS_ is false.
|
|
||||||
void ClearSpecifications();
|
|
||||||
|
|
||||||
// Given an OFFSET and a CU that starts at COMPILATION_UNIT_START, returns
|
|
||||||
// true if this is an inter-compilation unit reference that is not being
|
|
||||||
// handled.
|
|
||||||
bool IsUnhandledInterCUReference(uint64 offset,
|
|
||||||
uint64 compilation_unit_start) const;
|
|
||||||
|
|
||||||
// The name of this file, for use in error messages.
|
|
||||||
const string filename_;
|
|
||||||
|
|
||||||
// A map of this file's sections, used for finding other DWARF
|
|
||||||
// sections that the .debug_info section may refer to.
|
|
||||||
dwarf2reader::SectionMap section_map_;
|
|
||||||
|
|
||||||
// The Module to which we're contributing definitions.
|
|
||||||
Module *module_;
|
|
||||||
|
|
||||||
// True if we are handling references between compilation units.
|
|
||||||
const bool handle_inter_cu_refs_;
|
|
||||||
|
|
||||||
// Inter-compilation unit data used internally by the handlers.
|
|
||||||
scoped_ptr<FilePrivate> file_private_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// An abstract base class for handlers that handle DWARF range lists for
|
|
||||||
// DwarfCUToModule.
|
|
||||||
class RangesHandler {
|
|
||||||
public:
|
|
||||||
RangesHandler() { }
|
|
||||||
virtual ~RangesHandler() { }
|
|
||||||
|
|
||||||
// Called when finishing a function to populate the function's ranges.
|
|
||||||
// The ranges' entries are read starting from offset in the .debug_ranges
|
|
||||||
// section, base_address holds the base PC the range list values are
|
|
||||||
// offsets off. Return false if the rangelist falls out of the
|
|
||||||
// .debug_ranges section.
|
|
||||||
virtual bool ReadRanges(uint64 offset, Module::Address base_address,
|
|
||||||
vector<Module::Range>* ranges) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// An abstract base class for handlers that handle DWARF line data
|
|
||||||
// for DwarfCUToModule. DwarfCUToModule could certainly just use
|
|
||||||
// dwarf2reader::LineInfo itself directly, but decoupling things
|
|
||||||
// this way makes unit testing a little easier.
|
|
||||||
class LineToModuleHandler {
|
|
||||||
public:
|
|
||||||
LineToModuleHandler() { }
|
|
||||||
virtual ~LineToModuleHandler() { }
|
|
||||||
|
|
||||||
// Called at the beginning of a new compilation unit, prior to calling
|
|
||||||
// ReadProgram(). compilation_dir will indicate the path that the
|
|
||||||
// current compilation unit was compiled in, consistent with the
|
|
||||||
// DW_AT_comp_dir DIE.
|
|
||||||
virtual void StartCompilationUnit(const string& compilation_dir) = 0;
|
|
||||||
|
|
||||||
// Populate MODULE and LINES with source file names and code/line
|
|
||||||
// mappings, given a pointer to some DWARF line number data
|
|
||||||
// PROGRAM, and an overestimate of its size. Add no zero-length
|
|
||||||
// lines to LINES.
|
|
||||||
virtual void ReadProgram(const uint8_t *program, uint64 length,
|
|
||||||
Module *module, vector<Module::Line> *lines) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The interface DwarfCUToModule uses to report warnings. The member
|
|
||||||
// function definitions for this class write messages to stderr, but
|
|
||||||
// you can override them if you'd like to detect or report these
|
|
||||||
// conditions yourself.
|
|
||||||
class WarningReporter {
|
|
||||||
public:
|
|
||||||
// Warn about problems in the DWARF file FILENAME, in the
|
|
||||||
// compilation unit at OFFSET.
|
|
||||||
WarningReporter(const string &filename, uint64 cu_offset)
|
|
||||||
: filename_(filename), cu_offset_(cu_offset), printed_cu_header_(false),
|
|
||||||
printed_unpaired_header_(false),
|
|
||||||
uncovered_warnings_enabled_(false) { }
|
|
||||||
virtual ~WarningReporter() { }
|
|
||||||
|
|
||||||
// Set the name of the compilation unit we're processing to NAME.
|
|
||||||
virtual void SetCUName(const string &name) { cu_name_ = name; }
|
|
||||||
|
|
||||||
// Accessor and setter for uncovered_warnings_enabled_.
|
|
||||||
// UncoveredFunction and UncoveredLine only report a problem if that is
|
|
||||||
// true. By default, these warnings are disabled, because those
|
|
||||||
// conditions occur occasionally in healthy code.
|
|
||||||
virtual bool uncovered_warnings_enabled() const {
|
|
||||||
return uncovered_warnings_enabled_;
|
|
||||||
}
|
|
||||||
virtual void set_uncovered_warnings_enabled(bool value) {
|
|
||||||
uncovered_warnings_enabled_ = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A DW_AT_specification in the DIE at OFFSET refers to a DIE we
|
|
||||||
// haven't processed yet, or that wasn't marked as a declaration,
|
|
||||||
// at TARGET.
|
|
||||||
virtual void UnknownSpecification(uint64 offset, uint64 target);
|
|
||||||
|
|
||||||
// A DW_AT_abstract_origin in the DIE at OFFSET refers to a DIE we
|
|
||||||
// haven't processed yet, or that wasn't marked as inline, at TARGET.
|
|
||||||
virtual void UnknownAbstractOrigin(uint64 offset, uint64 target);
|
|
||||||
|
|
||||||
// We were unable to find the DWARF section named SECTION_NAME.
|
|
||||||
virtual void MissingSection(const string §ion_name);
|
|
||||||
|
|
||||||
// The CU's DW_AT_stmt_list offset OFFSET is bogus.
|
|
||||||
virtual void BadLineInfoOffset(uint64 offset);
|
|
||||||
|
|
||||||
// FUNCTION includes code covered by no line number data.
|
|
||||||
virtual void UncoveredFunction(const Module::Function &function);
|
|
||||||
|
|
||||||
// Line number NUMBER in LINE_FILE, of length LENGTH, includes code
|
|
||||||
// covered by no function.
|
|
||||||
virtual void UncoveredLine(const Module::Line &line);
|
|
||||||
|
|
||||||
// The DW_TAG_subprogram DIE at OFFSET has no name specified directly
|
|
||||||
// in the DIE, nor via a DW_AT_specification or DW_AT_abstract_origin
|
|
||||||
// link.
|
|
||||||
virtual void UnnamedFunction(uint64 offset);
|
|
||||||
|
|
||||||
// __cxa_demangle() failed to demangle INPUT.
|
|
||||||
virtual void DemangleError(const string &input);
|
|
||||||
|
|
||||||
// The DW_FORM_ref_addr at OFFSET to TARGET was not handled because
|
|
||||||
// FilePrivate did not retain the inter-CU specification data.
|
|
||||||
virtual void UnhandledInterCUReference(uint64 offset, uint64 target);
|
|
||||||
|
|
||||||
// The DW_AT_ranges at offset is malformed (truncated or outside of the
|
|
||||||
// .debug_ranges section's bound).
|
|
||||||
virtual void MalformedRangeList(uint64 offset);
|
|
||||||
|
|
||||||
// A DW_AT_ranges attribute was encountered but the no .debug_ranges
|
|
||||||
// section was found.
|
|
||||||
virtual void MissingRanges();
|
|
||||||
|
|
||||||
uint64 cu_offset() const {
|
|
||||||
return cu_offset_;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
const string filename_;
|
|
||||||
const uint64 cu_offset_;
|
|
||||||
string cu_name_;
|
|
||||||
bool printed_cu_header_;
|
|
||||||
bool printed_unpaired_header_;
|
|
||||||
bool uncovered_warnings_enabled_;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Print a per-CU heading, once.
|
|
||||||
void CUHeading();
|
|
||||||
// Print an unpaired function/line heading, once.
|
|
||||||
void UncoveredHeading();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a DWARF debugging info handler for a compilation unit
|
|
||||||
// within FILE_CONTEXT. This uses information received from the
|
|
||||||
// dwarf2reader::CompilationUnit DWARF parser to populate
|
|
||||||
// FILE_CONTEXT->module. Use LINE_READER to handle the compilation
|
|
||||||
// unit's line number data. Use REPORTER to report problems with the
|
|
||||||
// data we find.
|
|
||||||
DwarfCUToModule(FileContext *file_context,
|
|
||||||
LineToModuleHandler *line_reader,
|
|
||||||
RangesHandler *ranges_handler,
|
|
||||||
WarningReporter *reporter);
|
|
||||||
~DwarfCUToModule();
|
|
||||||
|
|
||||||
void ProcessAttributeSigned(enum DwarfAttribute attr,
|
|
||||||
enum DwarfForm form,
|
|
||||||
int64 data);
|
|
||||||
void ProcessAttributeUnsigned(enum DwarfAttribute attr,
|
|
||||||
enum DwarfForm form,
|
|
||||||
uint64 data);
|
|
||||||
void ProcessAttributeString(enum DwarfAttribute attr,
|
|
||||||
enum DwarfForm form,
|
|
||||||
const string &data);
|
|
||||||
bool EndAttributes();
|
|
||||||
DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag);
|
|
||||||
|
|
||||||
// Assign all our source Lines to the Functions that cover their
|
|
||||||
// addresses, and then add them to module_.
|
|
||||||
void Finish();
|
|
||||||
|
|
||||||
bool StartCompilationUnit(uint64 offset, uint8 address_size,
|
|
||||||
uint8 offset_size, uint64 cu_length,
|
|
||||||
uint8 dwarf_version);
|
|
||||||
bool StartRootDIE(uint64 offset, enum DwarfTag tag);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Used internally by the handler. Full definitions are in
|
|
||||||
// dwarf_cu_to_module.cc.
|
|
||||||
struct CUContext;
|
|
||||||
struct DIEContext;
|
|
||||||
struct Specification;
|
|
||||||
class GenericDIEHandler;
|
|
||||||
class FuncHandler;
|
|
||||||
class NamedScopeHandler;
|
|
||||||
|
|
||||||
// A map from section offsets to specifications.
|
|
||||||
typedef map<uint64, Specification> SpecificationByOffset;
|
|
||||||
|
|
||||||
// Set this compilation unit's source language to LANGUAGE.
|
|
||||||
void SetLanguage(DwarfLanguage language);
|
|
||||||
|
|
||||||
// Read source line information at OFFSET in the .debug_line
|
|
||||||
// section. Record source files in module_, but record source lines
|
|
||||||
// in lines_; we apportion them to functions in
|
|
||||||
// AssignLinesToFunctions.
|
|
||||||
void ReadSourceLines(uint64 offset);
|
|
||||||
|
|
||||||
// Assign the lines in lines_ to the individual line lists of the
|
|
||||||
// functions in functions_. (DWARF line information maps an entire
|
|
||||||
// compilation unit at a time, and gives no indication of which
|
|
||||||
// lines belong to which functions, beyond their addresses.)
|
|
||||||
void AssignLinesToFunctions();
|
|
||||||
|
|
||||||
// The only reason cu_context_ and child_context_ are pointers is
|
|
||||||
// that we want to keep their definitions private to
|
|
||||||
// dwarf_cu_to_module.cc, instead of listing them all here. They are
|
|
||||||
// owned by this DwarfCUToModule: the constructor sets them, and the
|
|
||||||
// destructor deletes them.
|
|
||||||
|
|
||||||
// The handler to use to handle line number data.
|
|
||||||
LineToModuleHandler *line_reader_;
|
|
||||||
|
|
||||||
// This compilation unit's context.
|
|
||||||
scoped_ptr<CUContext> cu_context_;
|
|
||||||
|
|
||||||
// A context for our children.
|
|
||||||
scoped_ptr<DIEContext> child_context_;
|
|
||||||
|
|
||||||
// True if this compilation unit has source line information.
|
|
||||||
bool has_source_line_info_;
|
|
||||||
|
|
||||||
// The offset of this compilation unit's line number information in
|
|
||||||
// the .debug_line section.
|
|
||||||
uint64 source_line_offset_;
|
|
||||||
|
|
||||||
// The line numbers we have seen thus far. We accumulate these here
|
|
||||||
// during parsing. Then, in Finish, we call AssignLinesToFunctions
|
|
||||||
// to dole them out to the appropriate functions.
|
|
||||||
vector<Module::Line> lines_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_DWARF_CU_TO_MODULE_H__
|
|
||||||
|
|
@ -1,188 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// The DwarfLineToModule class accepts line number information from a
|
|
||||||
// DWARF parser and adds it to a google_breakpad::Module. The Module
|
|
||||||
// can write that data out as a Breakpad symbol file.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_DWARF_LINE_TO_MODULE_H
|
|
||||||
#define COMMON_LINUX_DWARF_LINE_TO_MODULE_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/module.h"
|
|
||||||
#include "common/dwarf/dwarf2reader.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for producing a vector of google_breakpad::Module::Line
|
|
||||||
// instances from parsed DWARF line number data.
|
|
||||||
//
|
|
||||||
// An instance of this class can be provided as a handler to a
|
|
||||||
// dwarf2reader::LineInfo DWARF line number information parser. The
|
|
||||||
// handler accepts source location information from the parser and
|
|
||||||
// uses it to produce a vector of google_breakpad::Module::Line
|
|
||||||
// objects, referring to google_breakpad::Module::File objects added
|
|
||||||
// to a particular google_breakpad::Module.
|
|
||||||
//
|
|
||||||
// GNU toolchain omitted sections support:
|
|
||||||
// ======================================
|
|
||||||
//
|
|
||||||
// Given the right options, the GNU toolchain will omit unreferenced
|
|
||||||
// functions from the final executable. Unfortunately, when it does so, it
|
|
||||||
// does not remove the associated portions of the DWARF line number
|
|
||||||
// program; instead, it gives the DW_LNE_set_address instructions referring
|
|
||||||
// to the now-deleted code addresses of zero. Given this input, the DWARF
|
|
||||||
// line parser will call AddLine with a series of lines starting at address
|
|
||||||
// zero. For example, here is the output from 'readelf -wl' for a program
|
|
||||||
// with four functions, the first three of which have been omitted:
|
|
||||||
//
|
|
||||||
// Line Number Statements:
|
|
||||||
// Extended opcode 2: set Address to 0x0
|
|
||||||
// Advance Line by 14 to 15
|
|
||||||
// Copy
|
|
||||||
// Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 16
|
|
||||||
// Special opcode 119: advance Address by 8 to 0xb and Line by 2 to 18
|
|
||||||
// Advance PC by 2 to 0xd
|
|
||||||
// Extended opcode 1: End of Sequence
|
|
||||||
//
|
|
||||||
// Extended opcode 2: set Address to 0x0
|
|
||||||
// Advance Line by 14 to 15
|
|
||||||
// Copy
|
|
||||||
// Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 16
|
|
||||||
// Special opcode 119: advance Address by 8 to 0xb and Line by 2 to 18
|
|
||||||
// Advance PC by 2 to 0xd
|
|
||||||
// Extended opcode 1: End of Sequence
|
|
||||||
//
|
|
||||||
// Extended opcode 2: set Address to 0x0
|
|
||||||
// Advance Line by 19 to 20
|
|
||||||
// Copy
|
|
||||||
// Special opcode 48: advance Address by 3 to 0x3 and Line by 1 to 21
|
|
||||||
// Special opcode 76: advance Address by 5 to 0x8 and Line by 1 to 22
|
|
||||||
// Advance PC by 2 to 0xa
|
|
||||||
// Extended opcode 1: End of Sequence
|
|
||||||
//
|
|
||||||
// Extended opcode 2: set Address to 0x80483a4
|
|
||||||
// Advance Line by 23 to 24
|
|
||||||
// Copy
|
|
||||||
// Special opcode 202: advance Address by 14 to 0x80483b2 and Line by 1 to 25
|
|
||||||
// Special opcode 76: advance Address by 5 to 0x80483b7 and Line by 1 to 26
|
|
||||||
// Advance PC by 6 to 0x80483bd
|
|
||||||
// Extended opcode 1: End of Sequence
|
|
||||||
//
|
|
||||||
// Instead of collecting runs of lines describing code that is not there,
|
|
||||||
// we try to recognize and drop them. Since the linker doesn't explicitly
|
|
||||||
// distinguish references to dropped sections from genuine references to
|
|
||||||
// code at address zero, we must use a heuristic. We have chosen:
|
|
||||||
//
|
|
||||||
// - If a line starts at address zero, omit it. (On the platforms
|
|
||||||
// breakpad targets, it is extremely unlikely that there will be code
|
|
||||||
// at address zero.)
|
|
||||||
//
|
|
||||||
// - If a line starts immediately after an omitted line, omit it too.
|
|
||||||
class DwarfLineToModule: public dwarf2reader::LineInfoHandler {
|
|
||||||
public:
|
|
||||||
// As the DWARF line info parser passes us line records, add source
|
|
||||||
// files to MODULE, and add all lines to the end of LINES. LINES
|
|
||||||
// need not be empty. If the parser hands us a zero-length line, we
|
|
||||||
// omit it. If the parser hands us a line that extends beyond the
|
|
||||||
// end of the address space, we clip it. It's up to our client to
|
|
||||||
// sort out which lines belong to which functions; we don't add them
|
|
||||||
// to any particular function in MODULE ourselves.
|
|
||||||
DwarfLineToModule(Module *module, const string& compilation_dir,
|
|
||||||
vector<Module::Line> *lines)
|
|
||||||
: module_(module),
|
|
||||||
compilation_dir_(compilation_dir),
|
|
||||||
lines_(lines),
|
|
||||||
highest_file_number_(-1),
|
|
||||||
omitted_line_end_(0),
|
|
||||||
warned_bad_file_number_(false),
|
|
||||||
warned_bad_directory_number_(false) { }
|
|
||||||
|
|
||||||
~DwarfLineToModule() { }
|
|
||||||
|
|
||||||
void DefineDir(const string &name, uint32 dir_num);
|
|
||||||
void DefineFile(const string &name, int32 file_num,
|
|
||||||
uint32 dir_num, uint64 mod_time,
|
|
||||||
uint64 length);
|
|
||||||
void AddLine(uint64 address, uint64 length,
|
|
||||||
uint32 file_num, uint32 line_num, uint32 column_num);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
typedef std::map<uint32, string> DirectoryTable;
|
|
||||||
typedef std::map<uint32, Module::File *> FileTable;
|
|
||||||
|
|
||||||
// The module we're contributing debugging info to. Owned by our
|
|
||||||
// client.
|
|
||||||
Module *module_;
|
|
||||||
|
|
||||||
// The compilation directory for the current compilation unit whose
|
|
||||||
// lines are being accumulated.
|
|
||||||
string compilation_dir_;
|
|
||||||
|
|
||||||
// The vector of lines we're accumulating. Owned by our client.
|
|
||||||
//
|
|
||||||
// In a Module, as in a breakpad symbol file, lines belong to
|
|
||||||
// specific functions, but DWARF simply assigns lines to addresses;
|
|
||||||
// one must infer the line/function relationship using the
|
|
||||||
// functions' beginning and ending addresses. So we can't add these
|
|
||||||
// to the appropriate function from module_ until we've read the
|
|
||||||
// function info as well. Instead, we accumulate lines here, and let
|
|
||||||
// whoever constructed this sort it all out.
|
|
||||||
vector<Module::Line> *lines_;
|
|
||||||
|
|
||||||
// A table mapping directory numbers to paths.
|
|
||||||
DirectoryTable directories_;
|
|
||||||
|
|
||||||
// A table mapping file numbers to Module::File pointers.
|
|
||||||
FileTable files_;
|
|
||||||
|
|
||||||
// The highest file number we've seen so far, or -1 if we've seen
|
|
||||||
// none. Used for dynamically defined file numbers.
|
|
||||||
int32 highest_file_number_;
|
|
||||||
|
|
||||||
// This is the ending address of the last line we omitted, or zero if we
|
|
||||||
// didn't omit the previous line. It is zero before we have received any
|
|
||||||
// AddLine calls.
|
|
||||||
uint64 omitted_line_end_;
|
|
||||||
|
|
||||||
// True if we've warned about:
|
|
||||||
bool warned_bad_file_number_; // bad file numbers
|
|
||||||
bool warned_bad_directory_number_; // bad directory numbers
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_DWARF_LINE_TO_MODULE_H
|
|
||||||
|
|
@ -1,79 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2018 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Gabriele Svelto <gsvelto@mozilla.com>
|
|
||||||
// <gabriele.svelto@gmail.com>
|
|
||||||
|
|
||||||
// The DwarfRangeListHandler class accepts rangelist data from a DWARF parser
|
|
||||||
// and adds it to a google_breakpad::Function or other objects supporting
|
|
||||||
// ranges.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H
|
|
||||||
#define COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/module.h"
|
|
||||||
#include "common/dwarf/dwarf2reader.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class for producing a vector of google_breakpad::Module::Range
|
|
||||||
// instances from a parsed DWARF range list.
|
|
||||||
|
|
||||||
class DwarfRangeListHandler: public dwarf2reader::RangeListHandler {
|
|
||||||
public:
|
|
||||||
DwarfRangeListHandler(uint64 base_address, vector<Module::Range> *ranges)
|
|
||||||
: base_address_(base_address), ranges_(ranges) { }
|
|
||||||
|
|
||||||
~DwarfRangeListHandler() { }
|
|
||||||
|
|
||||||
// Add a range to the list
|
|
||||||
void AddRange(uint64 begin, uint64 end);
|
|
||||||
|
|
||||||
// Record the new base address and use it for the following entries
|
|
||||||
void SetBaseAddress(uint64 base_address);
|
|
||||||
|
|
||||||
// Sort the ranges so that they are in ascending order of starting address
|
|
||||||
void Finish();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// The current PC to add to every entry, this can be overridden by a special
|
|
||||||
// list entry
|
|
||||||
uint64 base_address_;
|
|
||||||
|
|
||||||
// The list of ranges to be populated
|
|
||||||
vector<Module::Range> *ranges_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H
|
|
||||||
|
|
@ -1,105 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// language.h: Define google_breakpad::Language. Instances of
|
|
||||||
// subclasses of this class provide language-appropriate operations
|
|
||||||
// for the Breakpad symbol dumper.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_LANGUAGE_H__
|
|
||||||
#define COMMON_LINUX_LANGUAGE_H__
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// An abstract base class for language-specific operations. We choose
|
|
||||||
// an instance of a subclass of this when we find the CU's language.
|
|
||||||
// This class's definitions are appropriate for CUs with no specified
|
|
||||||
// language.
|
|
||||||
class Language {
|
|
||||||
public:
|
|
||||||
// A base class destructor should be either public and virtual,
|
|
||||||
// or protected and nonvirtual.
|
|
||||||
virtual ~Language() {}
|
|
||||||
|
|
||||||
// Return true if this language has functions to which we can assign
|
|
||||||
// line numbers. (Debugging info for assembly language, for example,
|
|
||||||
// can have source location information, but does not have functions
|
|
||||||
// recorded using DW_TAG_subprogram DIEs.)
|
|
||||||
virtual bool HasFunctions() const { return true; }
|
|
||||||
|
|
||||||
// Construct a fully-qualified, language-appropriate form of NAME,
|
|
||||||
// given that PARENT_NAME is the name of the construct enclosing
|
|
||||||
// NAME. If PARENT_NAME is the empty string, then NAME is a
|
|
||||||
// top-level name.
|
|
||||||
//
|
|
||||||
// This API sort of assumes that a fully-qualified name is always
|
|
||||||
// some simple textual composition of the unqualified name and its
|
|
||||||
// parent's name, and that we don't need to know anything else about
|
|
||||||
// the parent or the child (say, their DIEs' tags) to do the job.
|
|
||||||
// This is true for the languages we support at the moment, and
|
|
||||||
// keeps things concrete. Perhaps a more refined operation would
|
|
||||||
// take into account the parent and child DIE types, allow languages
|
|
||||||
// to use their own data type for complex parent names, etc. But if
|
|
||||||
// C++ doesn't need all that, who would?
|
|
||||||
virtual string MakeQualifiedName (const string &parent_name,
|
|
||||||
const string &name) const = 0;
|
|
||||||
|
|
||||||
enum DemangleResult {
|
|
||||||
// Demangling was not performed because it’s not appropriate to attempt.
|
|
||||||
kDontDemangle = -1,
|
|
||||||
|
|
||||||
kDemangleSuccess,
|
|
||||||
kDemangleFailure,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Wraps abi::__cxa_demangle() or similar for languages where appropriate.
|
|
||||||
virtual DemangleResult DemangleName(const string& mangled,
|
|
||||||
string* demangled) const {
|
|
||||||
demangled->clear();
|
|
||||||
return kDontDemangle;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Instances for specific languages.
|
|
||||||
static const Language * const CPlusPlus,
|
|
||||||
* const Java,
|
|
||||||
* const Swift,
|
|
||||||
* const Rust,
|
|
||||||
* const Assembler;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_LANGUAGE_H__
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
// Copyright 2014 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_CRC32_H_
|
|
||||||
#define COMMON_LINUX_CRC32_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Updates a CRC32 checksum with |len| bytes from |buf|. |initial| holds the
|
|
||||||
// checksum result from the previous update; for the first call, it should be 0.
|
|
||||||
uint32_t UpdateCrc32(uint32_t initial, const void* buf, size_t len);
|
|
||||||
|
|
||||||
// Computes a CRC32 checksum using |len| bytes from |buf|.
|
|
||||||
inline uint32_t ComputeCrc32(const void* buf, size_t len) {
|
|
||||||
return UpdateCrc32(0, buf, len);
|
|
||||||
}
|
|
||||||
inline uint32_t ComputeCrc32(const std::string& str) {
|
|
||||||
return ComputeCrc32(str.c_str(), str.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_CRC32_H_
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// dump_symbols.h: Read debugging information from an ELF file, and write
|
|
||||||
// it out as a Breakpad symbol file.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_DUMP_SYMBOLS_H__
|
|
||||||
#define COMMON_LINUX_DUMP_SYMBOLS_H__
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/symbol_data.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class Module;
|
|
||||||
|
|
||||||
struct DumpOptions {
|
|
||||||
DumpOptions(SymbolData symbol_data, bool handle_inter_cu_refs)
|
|
||||||
: symbol_data(symbol_data),
|
|
||||||
handle_inter_cu_refs(handle_inter_cu_refs) {
|
|
||||||
}
|
|
||||||
|
|
||||||
SymbolData symbol_data;
|
|
||||||
bool handle_inter_cu_refs;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Find all the debugging information in OBJ_FILE, an ELF executable
|
|
||||||
// or shared library, and write it to SYM_STREAM in the Breakpad symbol
|
|
||||||
// file format.
|
|
||||||
// If OBJ_FILE has been stripped but contains a .gnu_debuglink section,
|
|
||||||
// then look for the debug file in DEBUG_DIRS.
|
|
||||||
// SYMBOL_DATA allows limiting the type of symbol data written.
|
|
||||||
bool WriteSymbolFile(const string &obj_file,
|
|
||||||
const std::vector<string>& debug_dirs,
|
|
||||||
const DumpOptions& options,
|
|
||||||
std::ostream &sym_stream);
|
|
||||||
|
|
||||||
// Read the selected object file's debugging information, and write out the
|
|
||||||
// header only to |stream|. Return true on success; if an error occurs, report
|
|
||||||
// it and return false.
|
|
||||||
bool WriteSymbolFileHeader(const string& obj_file,
|
|
||||||
std::ostream &sym_stream);
|
|
||||||
|
|
||||||
// As above, but simply return the debugging information in MODULE
|
|
||||||
// instead of writing it to a stream. The caller owns the resulting
|
|
||||||
// Module object and must delete it when finished.
|
|
||||||
bool ReadSymbolData(const string& obj_file,
|
|
||||||
const std::vector<string>& debug_dirs,
|
|
||||||
const DumpOptions& options,
|
|
||||||
Module** module);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_DUMP_SYMBOLS_H__
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_EINTR_WRAPPER_H_
|
|
||||||
#define COMMON_LINUX_EINTR_WRAPPER_H_
|
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
// This provides a wrapper around system calls which may be interrupted by a
|
|
||||||
// signal and return EINTR. See man 7 signal.
|
|
||||||
//
|
|
||||||
|
|
||||||
#define HANDLE_EINTR(x) ({ \
|
|
||||||
__typeof__(x) eintr_wrapper_result; \
|
|
||||||
do { \
|
|
||||||
eintr_wrapper_result = (x); \
|
|
||||||
} while (eintr_wrapper_result == -1 && errno == EINTR); \
|
|
||||||
eintr_wrapper_result; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define IGNORE_EINTR(x) ({ \
|
|
||||||
__typeof__(x) eintr_wrapper_result; \
|
|
||||||
do { \
|
|
||||||
eintr_wrapper_result = (x); \
|
|
||||||
if (eintr_wrapper_result == -1 && errno == EINTR) { \
|
|
||||||
eintr_wrapper_result = 0; \
|
|
||||||
} \
|
|
||||||
} while (0); \
|
|
||||||
eintr_wrapper_result; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_EINTR_WRAPPER_H_
|
|
||||||
|
|
@ -1,148 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// elf_core_dump.h: Define the google_breakpad::ElfCoreDump class, which
|
|
||||||
// encapsulates an ELF core dump file mapped into memory.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELF_CORE_DUMP_H_
|
|
||||||
#define COMMON_LINUX_ELF_CORE_DUMP_H_
|
|
||||||
|
|
||||||
#include <elf.h>
|
|
||||||
#include <link.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "common/memory_range.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A class encapsulating an ELF core dump file mapped into memory, which
|
|
||||||
// provides methods for accessing program headers and the note section.
|
|
||||||
class ElfCoreDump {
|
|
||||||
public:
|
|
||||||
// ELF types based on the value of __WORDSIZE.
|
|
||||||
typedef ElfW(Ehdr) Ehdr;
|
|
||||||
typedef ElfW(Nhdr) Nhdr;
|
|
||||||
typedef ElfW(Phdr) Phdr;
|
|
||||||
typedef ElfW(Word) Word;
|
|
||||||
typedef ElfW(Addr) Addr;
|
|
||||||
#if __WORDSIZE == 32
|
|
||||||
static const int kClass = ELFCLASS32;
|
|
||||||
#elif __WORDSIZE == 64
|
|
||||||
static const int kClass = ELFCLASS64;
|
|
||||||
#else
|
|
||||||
#error "Unsupported __WORDSIZE for ElfCoreDump."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// A class encapsulating the note content in a core dump, which provides
|
|
||||||
// methods for accessing the name and description of a note.
|
|
||||||
class Note {
|
|
||||||
public:
|
|
||||||
Note();
|
|
||||||
|
|
||||||
// Constructor that takes the note content from |content|.
|
|
||||||
explicit Note(const MemoryRange& content);
|
|
||||||
|
|
||||||
// Returns true if this note is valid, i,e. a note header is found in
|
|
||||||
// |content_|, or false otherwise.
|
|
||||||
bool IsValid() const;
|
|
||||||
|
|
||||||
// Returns the note header, or NULL if no note header is found in
|
|
||||||
// |content_|.
|
|
||||||
const Nhdr* GetHeader() const;
|
|
||||||
|
|
||||||
// Returns the note type, or 0 if no note header is found in |content_|.
|
|
||||||
Word GetType() const;
|
|
||||||
|
|
||||||
// Returns a memory range covering the note name, or an empty range
|
|
||||||
// if no valid note name is found in |content_|.
|
|
||||||
MemoryRange GetName() const;
|
|
||||||
|
|
||||||
// Returns a memory range covering the note description, or an empty
|
|
||||||
// range if no valid note description is found in |content_|.
|
|
||||||
MemoryRange GetDescription() const;
|
|
||||||
|
|
||||||
// Returns the note following this note, or an empty note if no valid
|
|
||||||
// note is found after this note.
|
|
||||||
Note GetNextNote() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Returns the size in bytes round up to the word alignment, specified
|
|
||||||
// for the note section, of a given size in bytes.
|
|
||||||
static size_t AlignedSize(size_t size);
|
|
||||||
|
|
||||||
// Note content.
|
|
||||||
MemoryRange content_;
|
|
||||||
};
|
|
||||||
|
|
||||||
ElfCoreDump();
|
|
||||||
|
|
||||||
// Constructor that takes the core dump content from |content|.
|
|
||||||
explicit ElfCoreDump(const MemoryRange& content);
|
|
||||||
|
|
||||||
// Sets the core dump content to |content|.
|
|
||||||
void SetContent(const MemoryRange& content);
|
|
||||||
|
|
||||||
// Returns true if a valid ELF header in the core dump, or false otherwise.
|
|
||||||
bool IsValid() const;
|
|
||||||
|
|
||||||
// Returns the ELF header in the core dump, or NULL if no ELF header
|
|
||||||
// is found in |content_|.
|
|
||||||
const Ehdr* GetHeader() const;
|
|
||||||
|
|
||||||
// Returns the |index|-th program header in the core dump, or NULL if no
|
|
||||||
// ELF header is found in |content_| or |index| is out of bounds.
|
|
||||||
const Phdr* GetProgramHeader(unsigned index) const;
|
|
||||||
|
|
||||||
// Returns the first program header of |type| in the core dump, or NULL if
|
|
||||||
// no ELF header is found in |content_| or no program header of |type| is
|
|
||||||
// found.
|
|
||||||
const Phdr* GetFirstProgramHeaderOfType(Word type) const;
|
|
||||||
|
|
||||||
// Returns the number of program headers in the core dump, or 0 if no
|
|
||||||
// ELF header is found in |content_|.
|
|
||||||
unsigned GetProgramHeaderCount() const;
|
|
||||||
|
|
||||||
// Copies |length| bytes of data starting at |virtual_address| in the core
|
|
||||||
// dump to |buffer|. |buffer| should be a valid pointer to a buffer of at
|
|
||||||
// least |length| bytes. Returns true if the data to be copied is found in
|
|
||||||
// the core dump, or false otherwise.
|
|
||||||
bool CopyData(void* buffer, Addr virtual_address, size_t length);
|
|
||||||
|
|
||||||
// Returns the first note found in the note section of the core dump, or
|
|
||||||
// an empty note if no note is found.
|
|
||||||
Note GetFirstNote() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Core dump content.
|
|
||||||
MemoryRange content_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELF_CORE_DUMP_H_
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
// -*- mode: C++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2013, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Lei Zhang <thestig@google.com>
|
|
||||||
|
|
||||||
// elf_gnu_compat.h: #defines unique to glibc's elf.h.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELF_GNU_COMPAT_H_
|
|
||||||
#define COMMON_LINUX_ELF_GNU_COMPAT_H_
|
|
||||||
|
|
||||||
#include <elf.h>
|
|
||||||
|
|
||||||
// A note type on GNU systems corresponding to the .note.gnu.build-id section.
|
|
||||||
#ifndef NT_GNU_BUILD_ID
|
|
||||||
#define NT_GNU_BUILD_ID 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Newer Linux systems offer this.
|
|
||||||
#ifndef NT_SIGINFO
|
|
||||||
#define NT_SIGINFO 0x53494749
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELF_GNU_COMPAT_H_
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2011 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>
|
|
||||||
|
|
||||||
// elf_symbols_to_module.h: Exposes ELFSymbolsToModule, a function
|
|
||||||
// for reading ELF symbol tables and inserting exported symbol names
|
|
||||||
// into a google_breakpad::Module as Extern definitions.
|
|
||||||
|
|
||||||
#ifndef BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_
|
|
||||||
#define BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class Module;
|
|
||||||
|
|
||||||
bool ELFSymbolsToModule(const uint8_t *symtab_section,
|
|
||||||
size_t symtab_size,
|
|
||||||
const uint8_t *string_section,
|
|
||||||
size_t string_size,
|
|
||||||
const bool big_endian,
|
|
||||||
size_t value_size,
|
|
||||||
Module *module);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
|
|
||||||
#endif // BREAKPAD_COMMON_LINUX_ELF_SYMBOLS_TO_MODULE_H_
|
|
||||||
|
|
@ -1,74 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELFUTILS_INL_H__
|
|
||||||
#define COMMON_LINUX_ELFUTILS_INL_H__
|
|
||||||
|
|
||||||
#include "common/linux/linux_libc_support.h"
|
|
||||||
#include "elfutils.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
template<typename ElfClass, typename T>
|
|
||||||
const T* GetOffset(const typename ElfClass::Ehdr* elf_header,
|
|
||||||
typename ElfClass::Off offset) {
|
|
||||||
return reinterpret_cast<const T*>(reinterpret_cast<uintptr_t>(elf_header) +
|
|
||||||
offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename ElfClass>
|
|
||||||
const typename ElfClass::Shdr* FindElfSectionByName(
|
|
||||||
const char* name,
|
|
||||||
typename ElfClass::Word section_type,
|
|
||||||
const typename ElfClass::Shdr* sections,
|
|
||||||
const char* section_names,
|
|
||||||
const char* names_end,
|
|
||||||
int nsection) {
|
|
||||||
assert(name != NULL);
|
|
||||||
assert(sections != NULL);
|
|
||||||
assert(nsection > 0);
|
|
||||||
|
|
||||||
int name_len = my_strlen(name);
|
|
||||||
if (name_len == 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for (int i = 0; i < nsection; ++i) {
|
|
||||||
const char* section_name = section_names + sections[i].sh_name;
|
|
||||||
if (sections[i].sh_type == section_type &&
|
|
||||||
names_end - section_name >= name_len + 1 &&
|
|
||||||
my_strcmp(name, section_name) == 0) {
|
|
||||||
return sections + i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELFUTILS_INL_H__
|
|
||||||
|
|
@ -1,127 +0,0 @@
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// elfutils.h: Utilities for dealing with ELF files.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_ELFUTILS_H_
|
|
||||||
#define COMMON_LINUX_ELFUTILS_H_
|
|
||||||
|
|
||||||
#include <elf.h>
|
|
||||||
#include <link.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "common/memory_allocator.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Traits classes so consumers can write templatized code to deal
|
|
||||||
// with specific ELF bits.
|
|
||||||
struct ElfClass32 {
|
|
||||||
typedef Elf32_Addr Addr;
|
|
||||||
typedef Elf32_Ehdr Ehdr;
|
|
||||||
typedef Elf32_Nhdr Nhdr;
|
|
||||||
typedef Elf32_Phdr Phdr;
|
|
||||||
typedef Elf32_Shdr Shdr;
|
|
||||||
typedef Elf32_Half Half;
|
|
||||||
typedef Elf32_Off Off;
|
|
||||||
typedef Elf32_Sym Sym;
|
|
||||||
typedef Elf32_Word Word;
|
|
||||||
|
|
||||||
static const int kClass = ELFCLASS32;
|
|
||||||
static const uint16_t kMachine = EM_386;
|
|
||||||
static const size_t kAddrSize = sizeof(Elf32_Addr);
|
|
||||||
static constexpr const char* kMachineName = "x86";
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ElfClass64 {
|
|
||||||
typedef Elf64_Addr Addr;
|
|
||||||
typedef Elf64_Ehdr Ehdr;
|
|
||||||
typedef Elf64_Nhdr Nhdr;
|
|
||||||
typedef Elf64_Phdr Phdr;
|
|
||||||
typedef Elf64_Shdr Shdr;
|
|
||||||
typedef Elf64_Half Half;
|
|
||||||
typedef Elf64_Off Off;
|
|
||||||
typedef Elf64_Sym Sym;
|
|
||||||
typedef Elf64_Word Word;
|
|
||||||
|
|
||||||
static const int kClass = ELFCLASS64;
|
|
||||||
static const uint16_t kMachine = EM_X86_64;
|
|
||||||
static const size_t kAddrSize = sizeof(Elf64_Addr);
|
|
||||||
static constexpr const char* kMachineName = "x86_64";
|
|
||||||
};
|
|
||||||
|
|
||||||
bool IsValidElf(const void* elf_header);
|
|
||||||
int ElfClass(const void* elf_base);
|
|
||||||
|
|
||||||
// Attempt to find a section named |section_name| of type |section_type|
|
|
||||||
// in the ELF binary data at |elf_mapped_base|. On success, returns true
|
|
||||||
// and sets |*section_start| to point to the start of the section data,
|
|
||||||
// and |*section_size| to the size of the section's data.
|
|
||||||
bool FindElfSection(const void *elf_mapped_base,
|
|
||||||
const char *section_name,
|
|
||||||
uint32_t section_type,
|
|
||||||
const void **section_start,
|
|
||||||
size_t *section_size);
|
|
||||||
|
|
||||||
// Internal helper method, exposed for convenience for callers
|
|
||||||
// that already have more info.
|
|
||||||
template<typename ElfClass>
|
|
||||||
const typename ElfClass::Shdr*
|
|
||||||
FindElfSectionByName(const char* name,
|
|
||||||
typename ElfClass::Word section_type,
|
|
||||||
const typename ElfClass::Shdr* sections,
|
|
||||||
const char* section_names,
|
|
||||||
const char* names_end,
|
|
||||||
int nsection);
|
|
||||||
|
|
||||||
struct ElfSegment {
|
|
||||||
const void* start;
|
|
||||||
size_t size;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Attempt to find all segments of type |segment_type| in the ELF
|
|
||||||
// binary data at |elf_mapped_base|. On success, returns true and fills
|
|
||||||
// |*segments| with a list of segments of the given type.
|
|
||||||
bool FindElfSegments(const void* elf_mapped_base,
|
|
||||||
uint32_t segment_type,
|
|
||||||
wasteful_vector<ElfSegment>* segments);
|
|
||||||
|
|
||||||
// Convert an offset from an Elf header into a pointer to the mapped
|
|
||||||
// address in the current process. Takes an extra template parameter
|
|
||||||
// to specify the return type to avoid having to dynamic_cast the
|
|
||||||
// result.
|
|
||||||
template<typename ElfClass, typename T>
|
|
||||||
const T*
|
|
||||||
GetOffset(const typename ElfClass::Ehdr* elf_header,
|
|
||||||
typename ElfClass::Off offset);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_ELFUTILS_H_
|
|
||||||
|
|
@ -1,88 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
// file_id.h: Return a unique identifier for a file
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_FILE_ID_H__
|
|
||||||
#define COMMON_LINUX_FILE_ID_H__
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/linux/guid_creator.h"
|
|
||||||
#include "common/memory_allocator.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// GNU binutils' ld defaults to 'sha1', which is 160 bits == 20 bytes,
|
|
||||||
// so this is enough to fit that, which most binaries will use.
|
|
||||||
// This is just a sensible default for auto_wasteful_vector so most
|
|
||||||
// callers can get away with stack allocation.
|
|
||||||
static const size_t kDefaultBuildIdSize = 20;
|
|
||||||
|
|
||||||
class FileID {
|
|
||||||
public:
|
|
||||||
explicit FileID(const char* path);
|
|
||||||
~FileID() {}
|
|
||||||
|
|
||||||
// Load the identifier for the elf file path specified in the constructor into
|
|
||||||
// |identifier|.
|
|
||||||
//
|
|
||||||
// The current implementation will look for a .note.gnu.build-id
|
|
||||||
// section and use that as the file id, otherwise it falls back to
|
|
||||||
// XORing the first 4096 bytes of the .text section to generate an identifier.
|
|
||||||
bool ElfFileIdentifier(wasteful_vector<uint8_t>& identifier);
|
|
||||||
|
|
||||||
// Load the identifier for the elf file mapped into memory at |base| into
|
|
||||||
// |identifier|. Return false if the identifier could not be created for this
|
|
||||||
// file.
|
|
||||||
static bool ElfFileIdentifierFromMappedFile(
|
|
||||||
const void* base,
|
|
||||||
wasteful_vector<uint8_t>& identifier);
|
|
||||||
|
|
||||||
// Convert the |identifier| data to a string. The string will
|
|
||||||
// be formatted as a UUID in all uppercase without dashes.
|
|
||||||
// (e.g., 22F065BBFC9C49F780FE26A7CEBD7BCE).
|
|
||||||
static string ConvertIdentifierToUUIDString(
|
|
||||||
const wasteful_vector<uint8_t>& identifier);
|
|
||||||
|
|
||||||
// Convert the entire |identifier| data to a hex string.
|
|
||||||
static string ConvertIdentifierToString(
|
|
||||||
const wasteful_vector<uint8_t>& identifier);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Storage for the path specified
|
|
||||||
string path_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_FILE_ID_H__
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_GOOGLE_CRASHDUMP_UPLOADER_H_
|
|
||||||
#define COMMON_LINUX_GOOGLE_CRASHDUMP_UPLOADER_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include "common/linux/libcurl_wrapper.h"
|
|
||||||
#include "common/scoped_ptr.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class GoogleCrashdumpUploader {
|
|
||||||
public:
|
|
||||||
GoogleCrashdumpUploader(const string& product,
|
|
||||||
const string& version,
|
|
||||||
const string& guid,
|
|
||||||
const string& ptime,
|
|
||||||
const string& ctime,
|
|
||||||
const string& email,
|
|
||||||
const string& comments,
|
|
||||||
const string& minidump_pathname,
|
|
||||||
const string& crash_server,
|
|
||||||
const string& proxy_host,
|
|
||||||
const string& proxy_userpassword);
|
|
||||||
|
|
||||||
GoogleCrashdumpUploader(const string& product,
|
|
||||||
const string& version,
|
|
||||||
const string& guid,
|
|
||||||
const string& ptime,
|
|
||||||
const string& ctime,
|
|
||||||
const string& email,
|
|
||||||
const string& comments,
|
|
||||||
const string& minidump_pathname,
|
|
||||||
const string& crash_server,
|
|
||||||
const string& proxy_host,
|
|
||||||
const string& proxy_userpassword,
|
|
||||||
LibcurlWrapper* http_layer);
|
|
||||||
|
|
||||||
void Init(const string& product,
|
|
||||||
const string& version,
|
|
||||||
const string& guid,
|
|
||||||
const string& ptime,
|
|
||||||
const string& ctime,
|
|
||||||
const string& email,
|
|
||||||
const string& comments,
|
|
||||||
const string& minidump_pathname,
|
|
||||||
const string& crash_server,
|
|
||||||
const string& proxy_host,
|
|
||||||
const string& proxy_userpassword,
|
|
||||||
LibcurlWrapper* http_layer);
|
|
||||||
bool Upload(int* http_status_code,
|
|
||||||
string* http_response_header,
|
|
||||||
string* http_response_body);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool CheckRequiredParametersArePresent();
|
|
||||||
|
|
||||||
scoped_ptr<LibcurlWrapper> http_layer_;
|
|
||||||
string product_;
|
|
||||||
string version_;
|
|
||||||
string guid_;
|
|
||||||
string ptime_;
|
|
||||||
string ctime_;
|
|
||||||
string email_;
|
|
||||||
string comments_;
|
|
||||||
string minidump_pathname_;
|
|
||||||
|
|
||||||
string crash_server_;
|
|
||||||
string proxy_host_;
|
|
||||||
string proxy_userpassword_;
|
|
||||||
|
|
||||||
std::map<string, string> parameters_;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_GOOGLE_CRASHDUMP_UPLOADER_H_
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_GUID_CREATOR_H__
|
|
||||||
#define COMMON_LINUX_GUID_CREATOR_H__
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
typedef MDGUID GUID;
|
|
||||||
|
|
||||||
// Format string for parsing GUID.
|
|
||||||
#define kGUIDFormatString "%08x-%04x-%04x-%08x-%08x"
|
|
||||||
// Length of GUID string. Don't count the ending '\0'.
|
|
||||||
#define kGUIDStringLength 36
|
|
||||||
|
|
||||||
// Create a guid.
|
|
||||||
bool CreateGUID(GUID *guid);
|
|
||||||
|
|
||||||
// Get the string from guid.
|
|
||||||
bool GUIDToString(const GUID *guid, char *buf, int buf_len);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// HTTPUpload provides a "nice" API to send a multipart HTTP(S) POST
|
|
||||||
// request using libcurl. It currently supports requests that contain
|
|
||||||
// a set of string parameters (key/value pairs), and a file to upload.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_HTTP_UPLOAD_H__
|
|
||||||
#define COMMON_LINUX_HTTP_UPLOAD_H__
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
using std::map;
|
|
||||||
|
|
||||||
class HTTPUpload {
|
|
||||||
public:
|
|
||||||
// Sends the given sets of parameters and files as a multipart POST
|
|
||||||
// request to the given URL.
|
|
||||||
// Each key in |files| is the name of the file part of the request
|
|
||||||
// (i.e. it corresponds to the name= attribute on an <input type="file">.
|
|
||||||
// Parameter names must contain only printable ASCII characters,
|
|
||||||
// and may not contain a quote (") character.
|
|
||||||
// Only HTTP(S) URLs are currently supported. Returns true on success.
|
|
||||||
// If the request is successful and response_body is non-NULL,
|
|
||||||
// the response body will be returned in response_body.
|
|
||||||
// If response_code is non-NULL, it will be set to the HTTP response code
|
|
||||||
// received (or 0 if the request failed before getting an HTTP response).
|
|
||||||
// If the send fails, a description of the error will be
|
|
||||||
// returned in error_description.
|
|
||||||
static bool SendRequest(const string &url,
|
|
||||||
const map<string, string> ¶meters,
|
|
||||||
const map<string, string> &files,
|
|
||||||
const string &proxy,
|
|
||||||
const string &proxy_user_pwd,
|
|
||||||
const string &ca_certificate_file,
|
|
||||||
string *response_body,
|
|
||||||
long *response_code,
|
|
||||||
string *error_description);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Checks that the given list of parameters has only printable
|
|
||||||
// ASCII characters in the parameter name, and does not contain
|
|
||||||
// any quote (") characters. Returns true if so.
|
|
||||||
static bool CheckParameters(const map<string, string> ¶meters);
|
|
||||||
|
|
||||||
// Checks the curl_lib parameter points to a valid curl lib.
|
|
||||||
static bool CheckCurlLib(void* curl_lib);
|
|
||||||
|
|
||||||
// No instances of this class should be created.
|
|
||||||
// Disallow all constructors, destructors, and operator=.
|
|
||||||
HTTPUpload();
|
|
||||||
explicit HTTPUpload(const HTTPUpload &);
|
|
||||||
void operator=(const HTTPUpload &);
|
|
||||||
~HTTPUpload();
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_HTTP_UPLOAD_H__
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
// Copyright (c) 2012 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_IGNORE_RET_H_
|
|
||||||
#define COMMON_LINUX_IGNORE_RET_H_
|
|
||||||
|
|
||||||
// Some compilers are prone to warn about unused return values. In cases where
|
|
||||||
// either a) the call cannot fail, or b) there is nothing that can be done when
|
|
||||||
// the call fails, IGNORE_RET() can be used to mark the return code as ignored.
|
|
||||||
// This avoids spurious compiler warnings.
|
|
||||||
|
|
||||||
#define IGNORE_RET(x) do { if (x) {} } while (0)
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_IGNORE_RET_H_
|
|
||||||
|
|
@ -1,93 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// A wrapper for libcurl to do HTTP Uploads, to support easy mocking
|
|
||||||
// and unit testing of the HTTPUpload class.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_LIBCURL_WRAPPER_H_
|
|
||||||
#define COMMON_LINUX_LIBCURL_WRAPPER_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
#include "third_party/curl/curl.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
class LibcurlWrapper {
|
|
||||||
public:
|
|
||||||
LibcurlWrapper();
|
|
||||||
virtual ~LibcurlWrapper();
|
|
||||||
virtual bool Init();
|
|
||||||
virtual bool SetProxy(const string& proxy_host,
|
|
||||||
const string& proxy_userpwd);
|
|
||||||
virtual bool AddFile(const string& upload_file_path,
|
|
||||||
const string& basename);
|
|
||||||
virtual bool SendRequest(const string& url,
|
|
||||||
const std::map<string, string>& parameters,
|
|
||||||
int* http_status_code,
|
|
||||||
string* http_header_data,
|
|
||||||
string* http_response_data);
|
|
||||||
private:
|
|
||||||
// This function initializes class state corresponding to function
|
|
||||||
// pointers into the CURL library.
|
|
||||||
bool SetFunctionPointers();
|
|
||||||
|
|
||||||
bool init_ok_; // Whether init succeeded
|
|
||||||
void* curl_lib_; // Pointer to result of dlopen() on
|
|
||||||
// curl library
|
|
||||||
string last_curl_error_; // The text of the last error when
|
|
||||||
// dealing
|
|
||||||
// with CURL.
|
|
||||||
|
|
||||||
CURL *curl_; // Pointer for handle for CURL calls.
|
|
||||||
|
|
||||||
CURL* (*easy_init_)(void);
|
|
||||||
|
|
||||||
// Stateful pointers for calling into curl_formadd()
|
|
||||||
struct curl_httppost *formpost_;
|
|
||||||
struct curl_httppost *lastptr_;
|
|
||||||
struct curl_slist *headerlist_;
|
|
||||||
|
|
||||||
// Function pointers into CURL library
|
|
||||||
CURLcode (*easy_setopt_)(CURL *, CURLoption, ...);
|
|
||||||
CURLFORMcode (*formadd_)(struct curl_httppost **,
|
|
||||||
struct curl_httppost **, ...);
|
|
||||||
struct curl_slist* (*slist_append_)(struct curl_slist *, const char *);
|
|
||||||
void (*slist_free_all_)(struct curl_slist *);
|
|
||||||
CURLcode (*easy_perform_)(CURL *);
|
|
||||||
const char* (*easy_strerror_)(CURLcode);
|
|
||||||
void (*easy_cleanup_)(CURL *);
|
|
||||||
CURLcode (*easy_getinfo_)(CURL *, CURLINFO info, ...);
|
|
||||||
void (*formfree_)(struct curl_httppost *);
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_LIBCURL_WRAPPER_H_
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// This header provides replacements for libc functions that we need. We if
|
|
||||||
// call the libc functions directly we risk crashing in the dynamic linker as
|
|
||||||
// it tries to resolve uncached PLT entries.
|
|
||||||
|
|
||||||
#ifndef CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
|
|
||||||
#define CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
|
|
||||||
extern size_t my_strlen(const char* s);
|
|
||||||
|
|
||||||
extern int my_strcmp(const char* a, const char* b);
|
|
||||||
|
|
||||||
extern int my_strncmp(const char* a, const char* b, size_t len);
|
|
||||||
|
|
||||||
// Parse a non-negative integer.
|
|
||||||
// result: (output) the resulting non-negative integer
|
|
||||||
// s: a NUL terminated string
|
|
||||||
// Return true iff successful.
|
|
||||||
extern bool my_strtoui(int* result, const char* s);
|
|
||||||
|
|
||||||
// Return the length of the given unsigned integer when expressed in base 10.
|
|
||||||
extern unsigned my_uint_len(uintmax_t i);
|
|
||||||
|
|
||||||
// Convert an unsigned integer to a string
|
|
||||||
// output: (output) the resulting string is written here. This buffer must be
|
|
||||||
// large enough to hold the resulting string. Call |my_uint_len| to get the
|
|
||||||
// required length.
|
|
||||||
// i: the unsigned integer to serialise.
|
|
||||||
// i_len: the length of the integer in base 10 (see |my_uint_len|).
|
|
||||||
extern void my_uitos(char* output, uintmax_t i, unsigned i_len);
|
|
||||||
|
|
||||||
extern const char* my_strchr(const char* haystack, char needle);
|
|
||||||
|
|
||||||
extern const char* my_strrchr(const char* haystack, char needle);
|
|
||||||
|
|
||||||
// Read a hex value
|
|
||||||
// result: (output) the resulting value
|
|
||||||
// s: a string
|
|
||||||
// Returns a pointer to the first invalid charactor.
|
|
||||||
extern const char* my_read_hex_ptr(uintptr_t* result, const char* s);
|
|
||||||
|
|
||||||
extern const char* my_read_decimal_ptr(uintptr_t* result, const char* s);
|
|
||||||
|
|
||||||
extern void my_memset(void* ip, char c, size_t len);
|
|
||||||
|
|
||||||
extern void* my_memchr(const void* src, int c, size_t len);
|
|
||||||
|
|
||||||
// The following are considered safe to use in a compromised environment.
|
|
||||||
// Besides, this gives the compiler an opportunity to optimize their calls.
|
|
||||||
#define my_memcpy memcpy
|
|
||||||
#define my_memmove memmove
|
|
||||||
#define my_memcmp memcmp
|
|
||||||
|
|
||||||
extern size_t my_strlcpy(char* s1, const char* s2, size_t len);
|
|
||||||
|
|
||||||
extern size_t my_strlcat(char* s1, const char* s2, size_t len);
|
|
||||||
|
|
||||||
extern int my_isspace(int ch);
|
|
||||||
|
|
||||||
} // extern "C"
|
|
||||||
|
|
||||||
#endif // CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// memory_mapped_file.h: Define the google_breakpad::MemoryMappedFile
|
|
||||||
// class, which maps a file into memory for read-only access.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_MEMORY_MAPPED_FILE_H_
|
|
||||||
#define COMMON_LINUX_MEMORY_MAPPED_FILE_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include "common/basictypes.h"
|
|
||||||
#include "common/memory_range.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A utility class for mapping a file into memory for read-only access of
|
|
||||||
// the file content. Its implementation avoids calling into libc functions
|
|
||||||
// by directly making system calls for open, close, mmap, and munmap.
|
|
||||||
class MemoryMappedFile {
|
|
||||||
public:
|
|
||||||
MemoryMappedFile();
|
|
||||||
|
|
||||||
// Constructor that calls Map() to map a file at |path| into memory.
|
|
||||||
// If Map() fails, the object behaves as if it is default constructed.
|
|
||||||
MemoryMappedFile(const char* path, size_t offset);
|
|
||||||
|
|
||||||
~MemoryMappedFile();
|
|
||||||
|
|
||||||
// Maps a file at |path| into memory, which can then be accessed via
|
|
||||||
// content() as a MemoryRange object or via data(), and returns true on
|
|
||||||
// success. Mapping an empty file will succeed but with data() and size()
|
|
||||||
// returning NULL and 0, respectively. An existing mapping is unmapped
|
|
||||||
// before a new mapping is created.
|
|
||||||
bool Map(const char* path, size_t offset);
|
|
||||||
|
|
||||||
// Unmaps the memory for the mapped file. It's a no-op if no file is
|
|
||||||
// mapped.
|
|
||||||
void Unmap();
|
|
||||||
|
|
||||||
// Returns a MemoryRange object that covers the memory for the mapped
|
|
||||||
// file. The MemoryRange object is empty if no file is mapped.
|
|
||||||
const MemoryRange& content() const { return content_; }
|
|
||||||
|
|
||||||
// Returns a pointer to the beginning of the memory for the mapped file.
|
|
||||||
// or NULL if no file is mapped or the mapped file is empty.
|
|
||||||
const void* data() const { return content_.data(); }
|
|
||||||
|
|
||||||
// Returns the size in bytes of the mapped file, or zero if no file
|
|
||||||
// is mapped.
|
|
||||||
size_t size() const { return content_.length(); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Mapped file content as a MemoryRange object.
|
|
||||||
MemoryRange content_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(MemoryMappedFile);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_MEMORY_MAPPED_FILE_H_
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// safe_readlink.h: Define the google_breakpad::SafeReadLink function,
|
|
||||||
// which wraps sys_readlink and gurantees the result is NULL-terminated.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_SAFE_READLINK_H_
|
|
||||||
#define COMMON_LINUX_SAFE_READLINK_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// This function wraps sys_readlink() and performs the same functionalty,
|
|
||||||
// but guarantees |buffer| is NULL-terminated if sys_readlink() returns
|
|
||||||
// no error. It takes the same arguments as sys_readlink(), but unlike
|
|
||||||
// sys_readlink(), it returns true on success.
|
|
||||||
//
|
|
||||||
// |buffer_size| specifies the size of |buffer| in bytes. As this function
|
|
||||||
// always NULL-terminates |buffer| on success, |buffer_size| should be
|
|
||||||
// at least one byte longer than the expected path length (e.g. PATH_MAX,
|
|
||||||
// which is typically defined as the maximum length of a path name
|
|
||||||
// including the NULL byte).
|
|
||||||
//
|
|
||||||
// The implementation of this function calls sys_readlink() instead of
|
|
||||||
// readlink(), it can thus be used in the context where calling to libc
|
|
||||||
// functions is discouraged.
|
|
||||||
bool SafeReadLink(const char* path, char* buffer, size_t buffer_size);
|
|
||||||
|
|
||||||
// Same as the three-argument version of SafeReadLink() but deduces the
|
|
||||||
// size of |buffer| if it is a char array of known size.
|
|
||||||
template <size_t N>
|
|
||||||
bool SafeReadLink(const char* path, char (&buffer)[N]) {
|
|
||||||
return SafeReadLink(path, buffer, sizeof(buffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_SAFE_READLINK_H_
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2011 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// symbol_upload.h: helper functions for linux symbol upload tool.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_SYMBOL_UPLOAD_H_
|
|
||||||
#define COMMON_LINUX_SYMBOL_UPLOAD_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
namespace sym_upload {
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
string symbolsPath;
|
|
||||||
string uploadURLStr;
|
|
||||||
string proxy;
|
|
||||||
string proxy_user_pwd;
|
|
||||||
string version;
|
|
||||||
bool success;
|
|
||||||
} Options;
|
|
||||||
|
|
||||||
// Starts upload to symbol server with options.
|
|
||||||
void Start(Options* options);
|
|
||||||
|
|
||||||
} // namespace sym_upload
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_SYMBOL_UPLOAD_H_
|
|
||||||
|
|
@ -1,197 +0,0 @@
|
||||||
// -*- mode: C++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Ted Mielczarek <ted.mielczarek@gmail.com>
|
|
||||||
|
|
||||||
// synth_elf.h: Interface to synth_elf::ELF: fake ELF generator.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_SYNTH_ELF_H_
|
|
||||||
#define COMMON_LINUX_SYNTH_ELF_H_
|
|
||||||
|
|
||||||
#include "common/test_assembler.h"
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
namespace synth_elf {
|
|
||||||
|
|
||||||
using std::list;
|
|
||||||
using std::vector;
|
|
||||||
using std::map;
|
|
||||||
using std::pair;
|
|
||||||
using test_assembler::Endianness;
|
|
||||||
using test_assembler::kLittleEndian;
|
|
||||||
using test_assembler::kUnsetEndian;
|
|
||||||
using test_assembler::Label;
|
|
||||||
using test_assembler::Section;
|
|
||||||
|
|
||||||
// String tables are common in ELF headers, so subclass Section
|
|
||||||
// to make them easy to generate.
|
|
||||||
class StringTable : public Section {
|
|
||||||
public:
|
|
||||||
StringTable(Endianness endianness = kUnsetEndian)
|
|
||||||
: Section(endianness) {
|
|
||||||
start() = 0;
|
|
||||||
empty_string = Add("");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the string s to the string table, and return
|
|
||||||
// a label containing the offset into the string table
|
|
||||||
// at which it was added.
|
|
||||||
Label Add(const string& s) {
|
|
||||||
if (strings_.find(s) != strings_.end())
|
|
||||||
return strings_[s];
|
|
||||||
|
|
||||||
Label string_label(Here());
|
|
||||||
AppendCString(s);
|
|
||||||
strings_[s] = string_label;
|
|
||||||
return string_label;
|
|
||||||
}
|
|
||||||
|
|
||||||
// All StringTables contain an empty string as their first
|
|
||||||
// entry.
|
|
||||||
Label empty_string;
|
|
||||||
|
|
||||||
// Avoid inserting duplicate strings.
|
|
||||||
map<string,Label> strings_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A Section representing an entire ELF file.
|
|
||||||
class ELF : public Section {
|
|
||||||
public:
|
|
||||||
ELF(uint16_t machine, // EM_386, etc
|
|
||||||
uint8_t file_class, // ELFCLASS{32,64}
|
|
||||||
Endianness endianness = kLittleEndian);
|
|
||||||
|
|
||||||
// Add the Section section to the section header table and append it
|
|
||||||
// to the file. Returns the index of the section in the section
|
|
||||||
// header table.
|
|
||||||
int AddSection(const string& name, const Section& section,
|
|
||||||
uint32_t type, uint32_t flags = 0, uint64_t addr = 0,
|
|
||||||
uint32_t link = 0, uint64_t entsize = 0, uint64_t offset = 0);
|
|
||||||
|
|
||||||
// Add a segment containing from section index start to section index end.
|
|
||||||
// The indexes must have been gotten from AddSection.
|
|
||||||
void AddSegment(int start, int end, uint32_t type, uint32_t flags = 0);
|
|
||||||
|
|
||||||
// Write out all data. GetContents may be used after this.
|
|
||||||
void Finish();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Size of an address, in bytes.
|
|
||||||
const size_t addr_size_;
|
|
||||||
|
|
||||||
// Offset to the program header table.
|
|
||||||
Label program_header_label_;
|
|
||||||
// Number of entries in the program header table.
|
|
||||||
int program_count_;
|
|
||||||
Label program_count_label_;
|
|
||||||
// The program header table itself.
|
|
||||||
Section program_header_table_;
|
|
||||||
|
|
||||||
// Offset to the section header table.
|
|
||||||
Label section_header_label_;
|
|
||||||
// Number of entries in the section header table.
|
|
||||||
int section_count_;
|
|
||||||
Label section_count_label_;
|
|
||||||
// The section header table itself.
|
|
||||||
Section section_header_table_;
|
|
||||||
|
|
||||||
// Index of the section header string table in the section
|
|
||||||
// header table.
|
|
||||||
Label section_header_string_index_;
|
|
||||||
// Section containing the names of section header table entries.
|
|
||||||
StringTable section_header_strings_;
|
|
||||||
|
|
||||||
// Record of an added section
|
|
||||||
struct ElfSection : public Section {
|
|
||||||
ElfSection(const Section& section, uint32_t type, uint32_t addr,
|
|
||||||
uint32_t offset, Label offset_label, uint32_t size)
|
|
||||||
: Section(section), type_(type), addr_(addr), offset_(offset)
|
|
||||||
, offset_label_(offset_label), size_(size) {
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t type_;
|
|
||||||
uint32_t addr_;
|
|
||||||
uint32_t offset_;
|
|
||||||
Label offset_label_;
|
|
||||||
uint32_t size_;
|
|
||||||
};
|
|
||||||
|
|
||||||
vector<ElfSection> sections_;
|
|
||||||
|
|
||||||
void AppendSection(ElfSection §ion);
|
|
||||||
};
|
|
||||||
|
|
||||||
// A class to build .symtab or .dynsym sections.
|
|
||||||
class SymbolTable : public Section {
|
|
||||||
public:
|
|
||||||
// table is the StringTable that contains symbol names. The caller
|
|
||||||
// must ensure that it remains alive for the life of the
|
|
||||||
// SymbolTable.
|
|
||||||
SymbolTable(Endianness endianness, size_t addr_size, StringTable& table);
|
|
||||||
|
|
||||||
// Add an Elf32_Sym.
|
|
||||||
void AddSymbol(const string& name, uint32_t value,
|
|
||||||
uint32_t size, unsigned info, uint16_t shndx);
|
|
||||||
// Add an Elf64_Sym.
|
|
||||||
void AddSymbol(const string& name, uint64_t value,
|
|
||||||
uint64_t size, unsigned info, uint16_t shndx);
|
|
||||||
|
|
||||||
private:
|
|
||||||
#ifndef NDEBUG
|
|
||||||
size_t addr_size_;
|
|
||||||
#endif
|
|
||||||
StringTable& table_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A class for note sections
|
|
||||||
class Notes : public Section {
|
|
||||||
public:
|
|
||||||
Notes(Endianness endianness)
|
|
||||||
: Section(endianness) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a note.
|
|
||||||
void AddNote(int type, const string &name, const uint8_t* desc_bytes,
|
|
||||||
size_t desc_size);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace synth_elf
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_SYNTH_ELF_H_
|
|
||||||
|
|
@ -1,87 +0,0 @@
|
||||||
// Copyright (c) 2017, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_LONG_STRING_DICTIONARY_H_
|
|
||||||
#define COMMON_LONG_STRING_DICTIONARY_H_
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/simple_string_dictionary.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
// key_size is the maxium size that |key| can take in
|
|
||||||
// SimpleStringDictionary which is defined in simple_string_dictionary.h.
|
|
||||||
//
|
|
||||||
// value_size is the maxium size that |value| can take in
|
|
||||||
// SimpleStringDictionary which is defined in simple_string_dictionary.h.
|
|
||||||
//
|
|
||||||
// LongStringDictionary is a subclass of SimpleStringDictionary which supports
|
|
||||||
// longer values to be stored in the dictionary. The maximum length supported is
|
|
||||||
// (value_size - 1) * 10.
|
|
||||||
//
|
|
||||||
// For example, LongStringDictionary will store long value with key 'abc' into
|
|
||||||
// segment values with segment keys 'abc__1', 'abc__2', 'abc__3', ...
|
|
||||||
//
|
|
||||||
// Clients must avoid using the same suffixes as their key's suffix when
|
|
||||||
// LongStringDictionary is used.
|
|
||||||
class LongStringDictionary : public SimpleStringDictionary {
|
|
||||||
public:
|
|
||||||
// Stores |value| into |key|, or segment values into segment keys. The maxium
|
|
||||||
// number of segments is 10. If |value| can not be stored in 10 segments, it
|
|
||||||
// will be truncated. Replacing the existing value if |key| is already present
|
|
||||||
// and replacing the existing segment values if segment keys are already
|
|
||||||
// present.
|
|
||||||
//
|
|
||||||
// |key| must not be NULL. If the |value| need to be divided into segments,
|
|
||||||
// the lengh of |key| must be smaller enough so that lengths of segment keys
|
|
||||||
// which are key with suffixes are all samller than (key_size - 1). Currently,
|
|
||||||
// the max length of suffixes are 4.
|
|
||||||
//
|
|
||||||
// If |value| is NULL, the key and its corresponding segment keys are removed
|
|
||||||
// from the map. If there is no more space in the map, then the operation
|
|
||||||
// silently fails.
|
|
||||||
void SetKeyValue(const char* key, const char* value);
|
|
||||||
|
|
||||||
// Given |key|, removes any associated value or associated segment values.
|
|
||||||
// |key| must not be NULL. If the key is not found, searchs its segment keys
|
|
||||||
// and removes corresponding segment values if found.
|
|
||||||
bool RemoveKey(const char* key);
|
|
||||||
|
|
||||||
// Given |key|, returns its corresponding |value|. |key| must not be NULL. If
|
|
||||||
// the key is found, its corresponding |value| is returned.
|
|
||||||
//
|
|
||||||
// If no corresponding |value| is found, segment keys of the given |key| will
|
|
||||||
// be used to search for corresponding segment values. If segment values
|
|
||||||
// exist, assembled value from them is returned. If no segment value exists,
|
|
||||||
// NULL is returned.
|
|
||||||
const std::string GetValueForKey(const char* key) const;
|
|
||||||
};
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LONG_STRING_DICTIONARY_H_
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
||||||
// Copyright 2007 Google Inc. All Rights Reserved.
|
|
||||||
// Author: liuli@google.com (Liu Li)
|
|
||||||
#ifndef COMMON_MD5_H__
|
|
||||||
#define COMMON_MD5_H__
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
typedef uint32_t u32;
|
|
||||||
typedef uint8_t u8;
|
|
||||||
|
|
||||||
struct MD5Context {
|
|
||||||
u32 buf[4];
|
|
||||||
u32 bits[2];
|
|
||||||
u8 in[64];
|
|
||||||
};
|
|
||||||
|
|
||||||
void MD5Init(struct MD5Context *ctx);
|
|
||||||
|
|
||||||
void MD5Update(struct MD5Context *ctx, unsigned char const *buf, size_t len);
|
|
||||||
|
|
||||||
void MD5Final(unsigned char digest[16], struct MD5Context *ctx);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_MD5_H__
|
|
||||||
|
|
@ -1,249 +0,0 @@
|
||||||
// Copyright (c) 2009, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MEMORY_ALLOCATOR_H_
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MEMORY_ALLOCATOR_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#if defined(MEMORY_SANITIZER)
|
|
||||||
#include <sanitizer/msan_interface.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
#define sys_mmap mmap
|
|
||||||
#define sys_munmap munmap
|
|
||||||
#define MAP_ANONYMOUS MAP_ANON
|
|
||||||
#else
|
|
||||||
#include "third_party/lss/linux_syscall_support.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// This is very simple allocator which fetches pages from the kernel directly.
|
|
||||||
// Thus, it can be used even when the heap may be corrupted.
|
|
||||||
//
|
|
||||||
// There is no free operation. The pages are only freed when the object is
|
|
||||||
// destroyed.
|
|
||||||
class PageAllocator {
|
|
||||||
public:
|
|
||||||
PageAllocator()
|
|
||||||
: page_size_(getpagesize()),
|
|
||||||
last_(NULL),
|
|
||||||
current_page_(NULL),
|
|
||||||
page_offset_(0),
|
|
||||||
pages_allocated_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
~PageAllocator() {
|
|
||||||
FreeAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
void *Alloc(size_t bytes) {
|
|
||||||
if (!bytes)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (current_page_ && page_size_ - page_offset_ >= bytes) {
|
|
||||||
uint8_t *const ret = current_page_ + page_offset_;
|
|
||||||
page_offset_ += bytes;
|
|
||||||
if (page_offset_ == page_size_) {
|
|
||||||
page_offset_ = 0;
|
|
||||||
current_page_ = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
const size_t pages =
|
|
||||||
(bytes + sizeof(PageHeader) + page_size_ - 1) / page_size_;
|
|
||||||
uint8_t *const ret = GetNPages(pages);
|
|
||||||
if (!ret)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
page_offset_ =
|
|
||||||
(page_size_ - (page_size_ * pages - (bytes + sizeof(PageHeader)))) %
|
|
||||||
page_size_;
|
|
||||||
current_page_ = page_offset_ ? ret + page_size_ * (pages - 1) : NULL;
|
|
||||||
|
|
||||||
return ret + sizeof(PageHeader);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks whether the page allocator owns the passed-in pointer.
|
|
||||||
// This method exists for testing pursposes only.
|
|
||||||
bool OwnsPointer(const void* p) {
|
|
||||||
for (PageHeader* header = last_; header; header = header->next) {
|
|
||||||
const char* current = reinterpret_cast<char*>(header);
|
|
||||||
if ((p >= current) && (p < current + header->num_pages * page_size_))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long pages_allocated() { return pages_allocated_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint8_t *GetNPages(size_t num_pages) {
|
|
||||||
void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,
|
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
|
||||||
if (a == MAP_FAILED)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
#if defined(MEMORY_SANITIZER)
|
|
||||||
// We need to indicate to MSan that memory allocated through sys_mmap is
|
|
||||||
// initialized, since linux_syscall_support.h doesn't have MSan hooks.
|
|
||||||
__msan_unpoison(a, page_size_ * num_pages);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct PageHeader *header = reinterpret_cast<PageHeader*>(a);
|
|
||||||
header->next = last_;
|
|
||||||
header->num_pages = num_pages;
|
|
||||||
last_ = header;
|
|
||||||
|
|
||||||
pages_allocated_ += num_pages;
|
|
||||||
|
|
||||||
return reinterpret_cast<uint8_t*>(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FreeAll() {
|
|
||||||
PageHeader *next;
|
|
||||||
|
|
||||||
for (PageHeader *cur = last_; cur; cur = next) {
|
|
||||||
next = cur->next;
|
|
||||||
sys_munmap(cur, cur->num_pages * page_size_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct PageHeader {
|
|
||||||
PageHeader *next; // pointer to the start of the next set of pages.
|
|
||||||
size_t num_pages; // the number of pages in this set.
|
|
||||||
};
|
|
||||||
|
|
||||||
const size_t page_size_;
|
|
||||||
PageHeader *last_;
|
|
||||||
uint8_t *current_page_;
|
|
||||||
size_t page_offset_;
|
|
||||||
unsigned long pages_allocated_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Wrapper to use with STL containers
|
|
||||||
template <typename T>
|
|
||||||
struct PageStdAllocator : public std::allocator<T> {
|
|
||||||
typedef typename std::allocator<T>::pointer pointer;
|
|
||||||
typedef typename std::allocator<T>::size_type size_type;
|
|
||||||
|
|
||||||
explicit PageStdAllocator(PageAllocator& allocator) : allocator_(allocator),
|
|
||||||
stackdata_(NULL),
|
|
||||||
stackdata_size_(0)
|
|
||||||
{}
|
|
||||||
|
|
||||||
template <class Other> PageStdAllocator(const PageStdAllocator<Other>& other)
|
|
||||||
: allocator_(other.allocator_),
|
|
||||||
stackdata_(nullptr),
|
|
||||||
stackdata_size_(0)
|
|
||||||
{}
|
|
||||||
|
|
||||||
explicit PageStdAllocator(PageAllocator& allocator,
|
|
||||||
pointer stackdata,
|
|
||||||
size_type stackdata_size) : allocator_(allocator),
|
|
||||||
stackdata_(stackdata),
|
|
||||||
stackdata_size_(stackdata_size)
|
|
||||||
{}
|
|
||||||
|
|
||||||
inline pointer allocate(size_type n, const void* = 0) {
|
|
||||||
const size_type size = sizeof(T) * n;
|
|
||||||
if (size <= stackdata_size_) {
|
|
||||||
return stackdata_;
|
|
||||||
}
|
|
||||||
return static_cast<pointer>(allocator_.Alloc(size));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void deallocate(pointer, size_type) {
|
|
||||||
// The PageAllocator doesn't free.
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename U> struct rebind {
|
|
||||||
typedef PageStdAllocator<U> other;
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Silly workaround for the gcc from Android's ndk (gcc 4.6), which will
|
|
||||||
// otherwise complain that `other.allocator_` is private in the constructor
|
|
||||||
// code.
|
|
||||||
template<typename Other> friend struct PageStdAllocator;
|
|
||||||
|
|
||||||
PageAllocator& allocator_;
|
|
||||||
pointer stackdata_;
|
|
||||||
size_type stackdata_size_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A wasteful vector is a std::vector, except that it allocates memory from a
|
|
||||||
// PageAllocator. It's wasteful because, when resizing, it always allocates a
|
|
||||||
// whole new array since the PageAllocator doesn't support realloc.
|
|
||||||
template<class T>
|
|
||||||
class wasteful_vector : public std::vector<T, PageStdAllocator<T> > {
|
|
||||||
public:
|
|
||||||
wasteful_vector(PageAllocator* allocator, unsigned size_hint = 16)
|
|
||||||
: std::vector<T, PageStdAllocator<T> >(PageStdAllocator<T>(*allocator)) {
|
|
||||||
std::vector<T, PageStdAllocator<T> >::reserve(size_hint);
|
|
||||||
}
|
|
||||||
protected:
|
|
||||||
wasteful_vector(PageStdAllocator<T> allocator)
|
|
||||||
: std::vector<T, PageStdAllocator<T> >(allocator) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
// auto_wasteful_vector allocates space on the stack for N entries to avoid
|
|
||||||
// using the PageAllocator for small data, while still allowing for larger data.
|
|
||||||
template<class T, unsigned int N>
|
|
||||||
class auto_wasteful_vector : public wasteful_vector<T> {
|
|
||||||
T stackdata_[N];
|
|
||||||
public:
|
|
||||||
auto_wasteful_vector(PageAllocator* allocator)
|
|
||||||
: wasteful_vector<T>(
|
|
||||||
PageStdAllocator<T>(*allocator,
|
|
||||||
&stackdata_[0],
|
|
||||||
sizeof(stackdata_))) {
|
|
||||||
std::vector<T, PageStdAllocator<T> >::reserve(N);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
inline void* operator new(size_t nbytes,
|
|
||||||
google_breakpad::PageAllocator& allocator) {
|
|
||||||
return allocator.Alloc(nbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_MEMORY_ALLOCATOR_H_
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
||||||
// Copyright (c) 2011, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// memory_range.h: Define the google_breakpad::MemoryRange class, which
|
|
||||||
// is a lightweight wrapper with a pointer and a length to encapsulate
|
|
||||||
// a contiguous range of memory.
|
|
||||||
|
|
||||||
#ifndef COMMON_MEMORY_RANGE_H_
|
|
||||||
#define COMMON_MEMORY_RANGE_H_
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A lightweight wrapper with a pointer and a length to encapsulate a
|
|
||||||
// contiguous range of memory. It provides helper methods for checked
|
|
||||||
// access of a subrange of the memory. Its implemementation does not
|
|
||||||
// allocate memory or call into libc functions, and is thus safer to use
|
|
||||||
// in a crashed environment.
|
|
||||||
class MemoryRange {
|
|
||||||
public:
|
|
||||||
MemoryRange() : data_(NULL), length_(0) {}
|
|
||||||
|
|
||||||
MemoryRange(const void* data, size_t length) {
|
|
||||||
Set(data, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true if this memory range contains no data.
|
|
||||||
bool IsEmpty() const {
|
|
||||||
// Set() guarantees that |length_| is zero if |data_| is NULL.
|
|
||||||
return length_ == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resets to an empty range.
|
|
||||||
void Reset() {
|
|
||||||
data_ = NULL;
|
|
||||||
length_ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets this memory range to point to |data| and its length to |length|.
|
|
||||||
void Set(const void* data, size_t length) {
|
|
||||||
data_ = reinterpret_cast<const uint8_t*>(data);
|
|
||||||
// Always set |length_| to zero if |data_| is NULL.
|
|
||||||
length_ = data ? length : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns true if this range covers a subrange of |sub_length| bytes
|
|
||||||
// at |sub_offset| bytes of this memory range, or false otherwise.
|
|
||||||
bool Covers(size_t sub_offset, size_t sub_length) const {
|
|
||||||
// The following checks verify that:
|
|
||||||
// 1. sub_offset is within [ 0 .. length_ - 1 ]
|
|
||||||
// 2. sub_offset + sub_length is within
|
|
||||||
// [ sub_offset .. length_ ]
|
|
||||||
return sub_offset < length_ &&
|
|
||||||
sub_offset + sub_length >= sub_offset &&
|
|
||||||
sub_offset + sub_length <= length_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a raw data pointer to a subrange of |sub_length| bytes at
|
|
||||||
// |sub_offset| bytes of this memory range, or NULL if the subrange
|
|
||||||
// is out of bounds.
|
|
||||||
const void* GetData(size_t sub_offset, size_t sub_length) const {
|
|
||||||
return Covers(sub_offset, sub_length) ? (data_ + sub_offset) : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Same as the two-argument version of GetData() but uses sizeof(DataType)
|
|
||||||
// as the subrange length and returns an |DataType| pointer for convenience.
|
|
||||||
template <typename DataType>
|
|
||||||
const DataType* GetData(size_t sub_offset) const {
|
|
||||||
return reinterpret_cast<const DataType*>(
|
|
||||||
GetData(sub_offset, sizeof(DataType)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a raw pointer to the |element_index|-th element of an array
|
|
||||||
// of elements of length |element_size| starting at |sub_offset| bytes
|
|
||||||
// of this memory range, or NULL if the element is out of bounds.
|
|
||||||
const void* GetArrayElement(size_t element_offset,
|
|
||||||
size_t element_size,
|
|
||||||
unsigned element_index) const {
|
|
||||||
size_t sub_offset = element_offset + element_index * element_size;
|
|
||||||
return GetData(sub_offset, element_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Same as the three-argument version of GetArrayElement() but deduces
|
|
||||||
// the element size using sizeof(ElementType) and returns an |ElementType|
|
|
||||||
// pointer for convenience.
|
|
||||||
template <typename ElementType>
|
|
||||||
const ElementType* GetArrayElement(size_t element_offset,
|
|
||||||
unsigned element_index) const {
|
|
||||||
return reinterpret_cast<const ElementType*>(
|
|
||||||
GetArrayElement(element_offset, sizeof(ElementType), element_index));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a subrange of |sub_length| bytes at |sub_offset| bytes of
|
|
||||||
// this memory range, or an empty range if the subrange is out of bounds.
|
|
||||||
MemoryRange Subrange(size_t sub_offset, size_t sub_length) const {
|
|
||||||
return Covers(sub_offset, sub_length) ?
|
|
||||||
MemoryRange(data_ + sub_offset, sub_length) : MemoryRange();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns a pointer to the beginning of this memory range.
|
|
||||||
const uint8_t* data() const { return data_; }
|
|
||||||
|
|
||||||
// Returns the length, in bytes, of this memory range.
|
|
||||||
size_t length() const { return length_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Pointer to the beginning of this memory range.
|
|
||||||
const uint8_t* data_;
|
|
||||||
|
|
||||||
// Length, in bytes, of this memory range.
|
|
||||||
size_t length_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_MEMORY_RANGE_H_
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
||||||
// Copyright (c) 2014, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
template <size_t>
|
|
||||||
struct MDTypeHelper;
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct MDTypeHelper<sizeof(uint32_t)> {
|
|
||||||
typedef MDRawDebug32 MDRawDebug;
|
|
||||||
typedef MDRawLinkMap32 MDRawLinkMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct MDTypeHelper<sizeof(uint64_t)> {
|
|
||||||
typedef MDRawDebug64 MDRawDebug;
|
|
||||||
typedef MDRawLinkMap64 MDRawLinkMap;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_
|
|
||||||
|
|
@ -1,346 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// module.h: Define google_breakpad::Module. A Module holds debugging
|
|
||||||
// information, and can write that information out as a Breakpad
|
|
||||||
// symbol file.
|
|
||||||
|
|
||||||
#ifndef COMMON_LINUX_MODULE_H__
|
|
||||||
#define COMMON_LINUX_MODULE_H__
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <map>
|
|
||||||
#include <set>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/symbol_data.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
using std::set;
|
|
||||||
using std::vector;
|
|
||||||
using std::map;
|
|
||||||
|
|
||||||
// A Module represents the contents of a module, and supports methods
|
|
||||||
// for adding information produced by parsing STABS or DWARF data
|
|
||||||
// --- possibly both from the same file --- and then writing out the
|
|
||||||
// unified contents as a Breakpad-format symbol file.
|
|
||||||
class Module {
|
|
||||||
public:
|
|
||||||
// The type of addresses and sizes in a symbol table.
|
|
||||||
typedef uint64_t Address;
|
|
||||||
struct File;
|
|
||||||
struct Function;
|
|
||||||
struct Line;
|
|
||||||
struct Extern;
|
|
||||||
|
|
||||||
// Addresses appearing in File, Function, and Line structures are
|
|
||||||
// absolute, not relative to the the module's load address. That
|
|
||||||
// is, if the module were loaded at its nominal load address, the
|
|
||||||
// addresses would be correct.
|
|
||||||
|
|
||||||
// A source file.
|
|
||||||
struct File {
|
|
||||||
explicit File(const string &name_input) : name(name_input), source_id(0) {}
|
|
||||||
|
|
||||||
// The name of the source file.
|
|
||||||
const string name;
|
|
||||||
|
|
||||||
// The file's source id. The Write member function clears this
|
|
||||||
// field and assigns source ids a fresh, so any value placed here
|
|
||||||
// before calling Write will be lost.
|
|
||||||
int source_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
// An address range.
|
|
||||||
struct Range {
|
|
||||||
Range(const Address address_input, const Address size_input) :
|
|
||||||
address(address_input), size(size_input) { }
|
|
||||||
|
|
||||||
Address address;
|
|
||||||
Address size;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A function.
|
|
||||||
struct Function {
|
|
||||||
Function(const string &name_input, const Address &address_input) :
|
|
||||||
name(name_input), address(address_input), parameter_size(0) {}
|
|
||||||
|
|
||||||
// For sorting by address. (Not style-guide compliant, but it's
|
|
||||||
// stupid not to put this in the struct.)
|
|
||||||
static bool CompareByAddress(const Function *x, const Function *y) {
|
|
||||||
return x->address < y->address;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The function's name.
|
|
||||||
const string name;
|
|
||||||
|
|
||||||
// The start address and the address ranges covered by the function.
|
|
||||||
const Address address;
|
|
||||||
vector<Range> ranges;
|
|
||||||
|
|
||||||
// The function's parameter size.
|
|
||||||
Address parameter_size;
|
|
||||||
|
|
||||||
// Source lines belonging to this function, sorted by increasing
|
|
||||||
// address.
|
|
||||||
vector<Line> lines;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A source line.
|
|
||||||
struct Line {
|
|
||||||
// For sorting by address. (Not style-guide compliant, but it's
|
|
||||||
// stupid not to put this in the struct.)
|
|
||||||
static bool CompareByAddress(const Module::Line &x, const Module::Line &y) {
|
|
||||||
return x.address < y.address;
|
|
||||||
}
|
|
||||||
|
|
||||||
Address address, size; // The address and size of the line's code.
|
|
||||||
File *file; // The source file.
|
|
||||||
int number; // The source line number.
|
|
||||||
};
|
|
||||||
|
|
||||||
// An exported symbol.
|
|
||||||
struct Extern {
|
|
||||||
explicit Extern(const Address &address_input) : address(address_input) {}
|
|
||||||
const Address address;
|
|
||||||
string name;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A map from register names to postfix expressions that recover
|
|
||||||
// their their values. This can represent a complete set of rules to
|
|
||||||
// follow at some address, or a set of changes to be applied to an
|
|
||||||
// extant set of rules.
|
|
||||||
typedef map<string, string> RuleMap;
|
|
||||||
|
|
||||||
// A map from addresses to RuleMaps, representing changes that take
|
|
||||||
// effect at given addresses.
|
|
||||||
typedef map<Address, RuleMap> RuleChangeMap;
|
|
||||||
|
|
||||||
// A range of 'STACK CFI' stack walking information. An instance of
|
|
||||||
// this structure corresponds to a 'STACK CFI INIT' record and the
|
|
||||||
// subsequent 'STACK CFI' records that fall within its range.
|
|
||||||
struct StackFrameEntry {
|
|
||||||
// The starting address and number of bytes of machine code this
|
|
||||||
// entry covers.
|
|
||||||
Address address, size;
|
|
||||||
|
|
||||||
// The initial register recovery rules, in force at the starting
|
|
||||||
// address.
|
|
||||||
RuleMap initial_rules;
|
|
||||||
|
|
||||||
// A map from addresses to rule changes. To find the rules in
|
|
||||||
// force at a given address, start with initial_rules, and then
|
|
||||||
// apply the changes given in this map for all addresses up to and
|
|
||||||
// including the address you're interested in.
|
|
||||||
RuleChangeMap rule_changes;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FunctionCompare {
|
|
||||||
bool operator() (const Function *lhs,
|
|
||||||
const Function *rhs) const {
|
|
||||||
if (lhs->address == rhs->address)
|
|
||||||
return lhs->name < rhs->name;
|
|
||||||
return lhs->address < rhs->address;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ExternCompare {
|
|
||||||
bool operator() (const Extern *lhs,
|
|
||||||
const Extern *rhs) const {
|
|
||||||
return lhs->address < rhs->address;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a new module with the given name, operating system,
|
|
||||||
// architecture, and ID string.
|
|
||||||
Module(const string &name, const string &os, const string &architecture,
|
|
||||||
const string &id, const string &code_id = "");
|
|
||||||
~Module();
|
|
||||||
|
|
||||||
// Set the module's load address to LOAD_ADDRESS; addresses given
|
|
||||||
// for functions and lines will be written to the Breakpad symbol
|
|
||||||
// file as offsets from this address. Construction initializes this
|
|
||||||
// module's load address to zero: addresses written to the symbol
|
|
||||||
// file will be the same as they appear in the Function, Line, and
|
|
||||||
// StackFrameEntry structures.
|
|
||||||
//
|
|
||||||
// Note that this member function has no effect on addresses stored
|
|
||||||
// in the data added to this module; the Write member function
|
|
||||||
// simply subtracts off the load address from addresses before it
|
|
||||||
// prints them. Only the last load address given before calling
|
|
||||||
// Write is used.
|
|
||||||
void SetLoadAddress(Address load_address);
|
|
||||||
|
|
||||||
// Add FUNCTION to the module. FUNCTION's name must not be empty.
|
|
||||||
// This module owns all Function objects added with this function:
|
|
||||||
// destroying the module destroys them as well.
|
|
||||||
void AddFunction(Function *function);
|
|
||||||
|
|
||||||
// Add all the functions in [BEGIN,END) to the module.
|
|
||||||
// This module owns all Function objects added with this function:
|
|
||||||
// destroying the module destroys them as well.
|
|
||||||
void AddFunctions(vector<Function *>::iterator begin,
|
|
||||||
vector<Function *>::iterator end);
|
|
||||||
|
|
||||||
// Add STACK_FRAME_ENTRY to the module.
|
|
||||||
// This module owns all StackFrameEntry objects added with this
|
|
||||||
// function: destroying the module destroys them as well.
|
|
||||||
void AddStackFrameEntry(StackFrameEntry *stack_frame_entry);
|
|
||||||
|
|
||||||
// Add PUBLIC to the module.
|
|
||||||
// This module owns all Extern objects added with this function:
|
|
||||||
// destroying the module destroys them as well.
|
|
||||||
void AddExtern(Extern *ext);
|
|
||||||
|
|
||||||
// If this module has a file named NAME, return a pointer to it. If
|
|
||||||
// it has none, then create one and return a pointer to the new
|
|
||||||
// file. This module owns all File objects created using these
|
|
||||||
// functions; destroying the module destroys them as well.
|
|
||||||
File *FindFile(const string &name);
|
|
||||||
File *FindFile(const char *name);
|
|
||||||
|
|
||||||
// If this module has a file named NAME, return a pointer to it.
|
|
||||||
// Otherwise, return NULL.
|
|
||||||
File *FindExistingFile(const string &name);
|
|
||||||
|
|
||||||
// Insert pointers to the functions added to this module at I in
|
|
||||||
// VEC. The pointed-to Functions are still owned by this module.
|
|
||||||
// (Since this is effectively a copy of the function list, this is
|
|
||||||
// mostly useful for testing; other uses should probably get a more
|
|
||||||
// appropriate interface.)
|
|
||||||
void GetFunctions(vector<Function *> *vec, vector<Function *>::iterator i);
|
|
||||||
|
|
||||||
// Insert pointers to the externs added to this module at I in
|
|
||||||
// VEC. The pointed-to Externs are still owned by this module.
|
|
||||||
// (Since this is effectively a copy of the extern list, this is
|
|
||||||
// mostly useful for testing; other uses should probably get a more
|
|
||||||
// appropriate interface.)
|
|
||||||
void GetExterns(vector<Extern *> *vec, vector<Extern *>::iterator i);
|
|
||||||
|
|
||||||
// Clear VEC and fill it with pointers to the Files added to this
|
|
||||||
// module, sorted by name. The pointed-to Files are still owned by
|
|
||||||
// this module. (Since this is effectively a copy of the file list,
|
|
||||||
// this is mostly useful for testing; other uses should probably get
|
|
||||||
// a more appropriate interface.)
|
|
||||||
void GetFiles(vector<File *> *vec);
|
|
||||||
|
|
||||||
// Clear VEC and fill it with pointers to the StackFrameEntry
|
|
||||||
// objects that have been added to this module. (Since this is
|
|
||||||
// effectively a copy of the stack frame entry list, this is mostly
|
|
||||||
// useful for testing; other uses should probably get
|
|
||||||
// a more appropriate interface.)
|
|
||||||
void GetStackFrameEntries(vector<StackFrameEntry *> *vec) const;
|
|
||||||
|
|
||||||
// Find those files in this module that are actually referred to by
|
|
||||||
// functions' line number data, and assign them source id numbers.
|
|
||||||
// Set the source id numbers for all other files --- unused by the
|
|
||||||
// source line data --- to -1. We do this before writing out the
|
|
||||||
// symbol file, at which point we omit any unused files.
|
|
||||||
void AssignSourceIds();
|
|
||||||
|
|
||||||
// Call AssignSourceIds, and write this module to STREAM in the
|
|
||||||
// breakpad symbol format. Return true if all goes well, or false if
|
|
||||||
// an error occurs. This method writes out:
|
|
||||||
// - a header based on the values given to the constructor,
|
|
||||||
// If symbol_data is not ONLY_CFI then:
|
|
||||||
// - the source files added via FindFile,
|
|
||||||
// - the functions added via AddFunctions, each with its lines,
|
|
||||||
// - all public records,
|
|
||||||
// If symbol_data is not NO_CFI then:
|
|
||||||
// - all CFI records.
|
|
||||||
// Addresses in the output are all relative to the load address
|
|
||||||
// established by SetLoadAddress.
|
|
||||||
bool Write(std::ostream &stream, SymbolData symbol_data);
|
|
||||||
|
|
||||||
string name() const { return name_; }
|
|
||||||
string os() const { return os_; }
|
|
||||||
string architecture() const { return architecture_; }
|
|
||||||
string identifier() const { return id_; }
|
|
||||||
string code_identifier() const { return code_id_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Report an error that has occurred writing the symbol file, using
|
|
||||||
// errno to find the appropriate cause. Return false.
|
|
||||||
static bool ReportError();
|
|
||||||
|
|
||||||
// Write RULE_MAP to STREAM, in the form appropriate for 'STACK CFI'
|
|
||||||
// records, without a final newline. Return true if all goes well;
|
|
||||||
// if an error occurs, return false, and leave errno set.
|
|
||||||
static bool WriteRuleMap(const RuleMap &rule_map, std::ostream &stream);
|
|
||||||
|
|
||||||
// Module header entries.
|
|
||||||
string name_, os_, architecture_, id_, code_id_;
|
|
||||||
|
|
||||||
// The module's nominal load address. Addresses for functions and
|
|
||||||
// lines are absolute, assuming the module is loaded at this
|
|
||||||
// address.
|
|
||||||
Address load_address_;
|
|
||||||
|
|
||||||
// Relation for maps whose keys are strings shared with some other
|
|
||||||
// structure.
|
|
||||||
struct CompareStringPtrs {
|
|
||||||
bool operator()(const string *x, const string *y) const { return *x < *y; }
|
|
||||||
};
|
|
||||||
|
|
||||||
// A map from filenames to File structures. The map's keys are
|
|
||||||
// pointers to the Files' names.
|
|
||||||
typedef map<const string *, File *, CompareStringPtrs> FileByNameMap;
|
|
||||||
|
|
||||||
// A set containing Function structures, sorted by address.
|
|
||||||
typedef set<Function *, FunctionCompare> FunctionSet;
|
|
||||||
|
|
||||||
// A set containing Extern structures, sorted by address.
|
|
||||||
typedef set<Extern *, ExternCompare> ExternSet;
|
|
||||||
|
|
||||||
// The module owns all the files and functions that have been added
|
|
||||||
// to it; destroying the module frees the Files and Functions these
|
|
||||||
// point to.
|
|
||||||
FileByNameMap files_; // This module's source files.
|
|
||||||
FunctionSet functions_; // This module's functions.
|
|
||||||
|
|
||||||
// The module owns all the call frame info entries that have been
|
|
||||||
// added to it.
|
|
||||||
vector<StackFrameEntry *> stack_frame_entries_;
|
|
||||||
|
|
||||||
// The module owns all the externs that have been added to it;
|
|
||||||
// destroying the module frees the Externs these point to.
|
|
||||||
ExternSet externs_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_LINUX_MODULE_H__
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
// Copyright 2017, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_PATH_HELPER_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_PATH_HELPER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
string BaseName(const string& path);
|
|
||||||
string DirName(const string& path);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_PATH_HELPER_H
|
|
||||||
|
|
@ -1,404 +0,0 @@
|
||||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Scopers help you manage ownership of a pointer, helping you easily manage the
|
|
||||||
// a pointer within a scope, and automatically destroying the pointer at the
|
|
||||||
// end of a scope. There are two main classes you will use, which correspond
|
|
||||||
// to the operators new/delete and new[]/delete[].
|
|
||||||
//
|
|
||||||
// Example usage (scoped_ptr):
|
|
||||||
// {
|
|
||||||
// scoped_ptr<Foo> foo(new Foo("wee"));
|
|
||||||
// } // foo goes out of scope, releasing the pointer with it.
|
|
||||||
//
|
|
||||||
// {
|
|
||||||
// scoped_ptr<Foo> foo; // No pointer managed.
|
|
||||||
// foo.reset(new Foo("wee")); // Now a pointer is managed.
|
|
||||||
// foo.reset(new Foo("wee2")); // Foo("wee") was destroyed.
|
|
||||||
// foo.reset(new Foo("wee3")); // Foo("wee2") was destroyed.
|
|
||||||
// foo->Method(); // Foo::Method() called.
|
|
||||||
// foo.get()->Method(); // Foo::Method() called.
|
|
||||||
// SomeFunc(foo.release()); // SomeFunc takes ownership, foo no longer
|
|
||||||
// // manages a pointer.
|
|
||||||
// foo.reset(new Foo("wee4")); // foo manages a pointer again.
|
|
||||||
// foo.reset(); // Foo("wee4") destroyed, foo no longer
|
|
||||||
// // manages a pointer.
|
|
||||||
// } // foo wasn't managing a pointer, so nothing was destroyed.
|
|
||||||
//
|
|
||||||
// Example usage (scoped_array):
|
|
||||||
// {
|
|
||||||
// scoped_array<Foo> foo(new Foo[100]);
|
|
||||||
// foo.get()->Method(); // Foo::Method on the 0th element.
|
|
||||||
// foo[10].Method(); // Foo::Method on the 10th element.
|
|
||||||
// }
|
|
||||||
|
|
||||||
#ifndef COMMON_SCOPED_PTR_H_
|
|
||||||
#define COMMON_SCOPED_PTR_H_
|
|
||||||
|
|
||||||
// This is an implementation designed to match the anticipated future TR2
|
|
||||||
// implementation of the scoped_ptr class, and its closely-related brethren,
|
|
||||||
// scoped_array, scoped_ptr_malloc.
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
|
|
||||||
// automatically deletes the pointer it holds (if any).
|
|
||||||
// That is, scoped_ptr<T> owns the T object that it points to.
|
|
||||||
// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
|
|
||||||
// Also like T*, scoped_ptr<T> is thread-compatible, and once you
|
|
||||||
// dereference it, you get the threadsafety guarantees of T.
|
|
||||||
//
|
|
||||||
// The size of a scoped_ptr is small:
|
|
||||||
// sizeof(scoped_ptr<C>) == sizeof(C*)
|
|
||||||
template <class C>
|
|
||||||
class scoped_ptr {
|
|
||||||
public:
|
|
||||||
|
|
||||||
// The element type
|
|
||||||
typedef C element_type;
|
|
||||||
|
|
||||||
// Constructor. Defaults to initializing with NULL.
|
|
||||||
// There is no way to create an uninitialized scoped_ptr.
|
|
||||||
// The input parameter must be allocated with new.
|
|
||||||
explicit scoped_ptr(C* p = NULL) : ptr_(p) { }
|
|
||||||
|
|
||||||
// Destructor. If there is a C object, delete it.
|
|
||||||
// We don't need to test ptr_ == NULL because C++ does that for us.
|
|
||||||
~scoped_ptr() {
|
|
||||||
enum { type_must_be_complete = sizeof(C) };
|
|
||||||
delete ptr_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset. Deletes the current owned object, if any.
|
|
||||||
// Then takes ownership of a new object, if given.
|
|
||||||
// this->reset(this->get()) works.
|
|
||||||
void reset(C* p = NULL) {
|
|
||||||
if (p != ptr_) {
|
|
||||||
enum { type_must_be_complete = sizeof(C) };
|
|
||||||
delete ptr_;
|
|
||||||
ptr_ = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Accessors to get the owned object.
|
|
||||||
// operator* and operator-> will assert() if there is no current object.
|
|
||||||
C& operator*() const {
|
|
||||||
assert(ptr_ != NULL);
|
|
||||||
return *ptr_;
|
|
||||||
}
|
|
||||||
C* operator->() const {
|
|
||||||
assert(ptr_ != NULL);
|
|
||||||
return ptr_;
|
|
||||||
}
|
|
||||||
C* get() const { return ptr_; }
|
|
||||||
|
|
||||||
// Comparison operators.
|
|
||||||
// These return whether two scoped_ptr refer to the same object, not just to
|
|
||||||
// two different but equal objects.
|
|
||||||
bool operator==(C* p) const { return ptr_ == p; }
|
|
||||||
bool operator!=(C* p) const { return ptr_ != p; }
|
|
||||||
|
|
||||||
// Swap two scoped pointers.
|
|
||||||
void swap(scoped_ptr& p2) {
|
|
||||||
C* tmp = ptr_;
|
|
||||||
ptr_ = p2.ptr_;
|
|
||||||
p2.ptr_ = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release a pointer.
|
|
||||||
// The return value is the current pointer held by this object.
|
|
||||||
// If this object holds a NULL pointer, the return value is NULL.
|
|
||||||
// After this operation, this object will hold a NULL pointer,
|
|
||||||
// and will not own the object any more.
|
|
||||||
C* release() {
|
|
||||||
C* retVal = ptr_;
|
|
||||||
ptr_ = NULL;
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
C* ptr_;
|
|
||||||
|
|
||||||
// Forbid comparison of scoped_ptr types. If C2 != C, it totally doesn't
|
|
||||||
// make sense, and if C2 == C, it still doesn't make sense because you should
|
|
||||||
// never have the same object owned by two different scoped_ptrs.
|
|
||||||
template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;
|
|
||||||
template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;
|
|
||||||
|
|
||||||
// Disallow evil constructors
|
|
||||||
scoped_ptr(const scoped_ptr&);
|
|
||||||
void operator=(const scoped_ptr&);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Free functions
|
|
||||||
template <class C>
|
|
||||||
void swap(scoped_ptr<C>& p1, scoped_ptr<C>& p2) {
|
|
||||||
p1.swap(p2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class C>
|
|
||||||
bool operator==(C* p1, const scoped_ptr<C>& p2) {
|
|
||||||
return p1 == p2.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class C>
|
|
||||||
bool operator!=(C* p1, const scoped_ptr<C>& p2) {
|
|
||||||
return p1 != p2.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// scoped_array<C> is like scoped_ptr<C>, except that the caller must allocate
|
|
||||||
// with new [] and the destructor deletes objects with delete [].
|
|
||||||
//
|
|
||||||
// As with scoped_ptr<C>, a scoped_array<C> either points to an object
|
|
||||||
// or is NULL. A scoped_array<C> owns the object that it points to.
|
|
||||||
// scoped_array<T> is thread-compatible, and once you index into it,
|
|
||||||
// the returned objects have only the threadsafety guarantees of T.
|
|
||||||
//
|
|
||||||
// Size: sizeof(scoped_array<C>) == sizeof(C*)
|
|
||||||
template <class C>
|
|
||||||
class scoped_array {
|
|
||||||
public:
|
|
||||||
|
|
||||||
// The element type
|
|
||||||
typedef C element_type;
|
|
||||||
|
|
||||||
// Constructor. Defaults to intializing with NULL.
|
|
||||||
// There is no way to create an uninitialized scoped_array.
|
|
||||||
// The input parameter must be allocated with new [].
|
|
||||||
explicit scoped_array(C* p = NULL) : array_(p) { }
|
|
||||||
|
|
||||||
// Destructor. If there is a C object, delete it.
|
|
||||||
// We don't need to test ptr_ == NULL because C++ does that for us.
|
|
||||||
~scoped_array() {
|
|
||||||
enum { type_must_be_complete = sizeof(C) };
|
|
||||||
delete[] array_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset. Deletes the current owned object, if any.
|
|
||||||
// Then takes ownership of a new object, if given.
|
|
||||||
// this->reset(this->get()) works.
|
|
||||||
void reset(C* p = NULL) {
|
|
||||||
if (p != array_) {
|
|
||||||
enum { type_must_be_complete = sizeof(C) };
|
|
||||||
delete[] array_;
|
|
||||||
array_ = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get one element of the current object.
|
|
||||||
// Will assert() if there is no current object, or index i is negative.
|
|
||||||
C& operator[](ptrdiff_t i) const {
|
|
||||||
assert(i >= 0);
|
|
||||||
assert(array_ != NULL);
|
|
||||||
return array_[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a pointer to the zeroth element of the current object.
|
|
||||||
// If there is no current object, return NULL.
|
|
||||||
C* get() const {
|
|
||||||
return array_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Comparison operators.
|
|
||||||
// These return whether two scoped_array refer to the same object, not just to
|
|
||||||
// two different but equal objects.
|
|
||||||
bool operator==(C* p) const { return array_ == p; }
|
|
||||||
bool operator!=(C* p) const { return array_ != p; }
|
|
||||||
|
|
||||||
// Swap two scoped arrays.
|
|
||||||
void swap(scoped_array& p2) {
|
|
||||||
C* tmp = array_;
|
|
||||||
array_ = p2.array_;
|
|
||||||
p2.array_ = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release an array.
|
|
||||||
// The return value is the current pointer held by this object.
|
|
||||||
// If this object holds a NULL pointer, the return value is NULL.
|
|
||||||
// After this operation, this object will hold a NULL pointer,
|
|
||||||
// and will not own the object any more.
|
|
||||||
C* release() {
|
|
||||||
C* retVal = array_;
|
|
||||||
array_ = NULL;
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
C* array_;
|
|
||||||
|
|
||||||
// Forbid comparison of different scoped_array types.
|
|
||||||
template <class C2> bool operator==(scoped_array<C2> const& p2) const;
|
|
||||||
template <class C2> bool operator!=(scoped_array<C2> const& p2) const;
|
|
||||||
|
|
||||||
// Disallow evil constructors
|
|
||||||
scoped_array(const scoped_array&);
|
|
||||||
void operator=(const scoped_array&);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Free functions
|
|
||||||
template <class C>
|
|
||||||
void swap(scoped_array<C>& p1, scoped_array<C>& p2) {
|
|
||||||
p1.swap(p2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class C>
|
|
||||||
bool operator==(C* p1, const scoped_array<C>& p2) {
|
|
||||||
return p1 == p2.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class C>
|
|
||||||
bool operator!=(C* p1, const scoped_array<C>& p2) {
|
|
||||||
return p1 != p2.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// This class wraps the c library function free() in a class that can be
|
|
||||||
// passed as a template argument to scoped_ptr_malloc below.
|
|
||||||
class ScopedPtrMallocFree {
|
|
||||||
public:
|
|
||||||
inline void operator()(void* x) const {
|
|
||||||
free(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
|
|
||||||
// second template argument, the functor used to free the object.
|
|
||||||
|
|
||||||
template<class C, class FreeProc = ScopedPtrMallocFree>
|
|
||||||
class scoped_ptr_malloc {
|
|
||||||
public:
|
|
||||||
|
|
||||||
// The element type
|
|
||||||
typedef C element_type;
|
|
||||||
|
|
||||||
// Constructor. Defaults to initializing with NULL.
|
|
||||||
// There is no way to create an uninitialized scoped_ptr.
|
|
||||||
// The input parameter must be allocated with an allocator that matches the
|
|
||||||
// Free functor. For the default Free functor, this is malloc, calloc, or
|
|
||||||
// realloc.
|
|
||||||
explicit scoped_ptr_malloc(C* p = NULL): ptr_(p) {}
|
|
||||||
|
|
||||||
// Destructor. If there is a C object, call the Free functor.
|
|
||||||
~scoped_ptr_malloc() {
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset. Calls the Free functor on the current owned object, if any.
|
|
||||||
// Then takes ownership of a new object, if given.
|
|
||||||
// this->reset(this->get()) works.
|
|
||||||
void reset(C* p = NULL) {
|
|
||||||
if (ptr_ != p) {
|
|
||||||
FreeProc free_proc;
|
|
||||||
free_proc(ptr_);
|
|
||||||
ptr_ = p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the current object.
|
|
||||||
// operator* and operator-> will cause an assert() failure if there is
|
|
||||||
// no current object.
|
|
||||||
C& operator*() const {
|
|
||||||
assert(ptr_ != NULL);
|
|
||||||
return *ptr_;
|
|
||||||
}
|
|
||||||
|
|
||||||
C* operator->() const {
|
|
||||||
assert(ptr_ != NULL);
|
|
||||||
return ptr_;
|
|
||||||
}
|
|
||||||
|
|
||||||
C* get() const {
|
|
||||||
return ptr_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Comparison operators.
|
|
||||||
// These return whether a scoped_ptr_malloc and a plain pointer refer
|
|
||||||
// to the same object, not just to two different but equal objects.
|
|
||||||
// For compatibility with the boost-derived implementation, these
|
|
||||||
// take non-const arguments.
|
|
||||||
bool operator==(C* p) const {
|
|
||||||
return ptr_ == p;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(C* p) const {
|
|
||||||
return ptr_ != p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap two scoped pointers.
|
|
||||||
void swap(scoped_ptr_malloc & b) {
|
|
||||||
C* tmp = b.ptr_;
|
|
||||||
b.ptr_ = ptr_;
|
|
||||||
ptr_ = tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release a pointer.
|
|
||||||
// The return value is the current pointer held by this object.
|
|
||||||
// If this object holds a NULL pointer, the return value is NULL.
|
|
||||||
// After this operation, this object will hold a NULL pointer,
|
|
||||||
// and will not own the object any more.
|
|
||||||
C* release() {
|
|
||||||
C* tmp = ptr_;
|
|
||||||
ptr_ = NULL;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
C* ptr_;
|
|
||||||
|
|
||||||
// no reason to use these: each scoped_ptr_malloc should have its own object
|
|
||||||
template <class C2, class GP>
|
|
||||||
bool operator==(scoped_ptr_malloc<C2, GP> const& p) const;
|
|
||||||
template <class C2, class GP>
|
|
||||||
bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const;
|
|
||||||
|
|
||||||
// Disallow evil constructors
|
|
||||||
scoped_ptr_malloc(const scoped_ptr_malloc&);
|
|
||||||
void operator=(const scoped_ptr_malloc&);
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class C, class FP> inline
|
|
||||||
void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) {
|
|
||||||
a.swap(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class C, class FP> inline
|
|
||||||
bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) {
|
|
||||||
return p == b.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class C, class FP> inline
|
|
||||||
bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) {
|
|
||||||
return p != b.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_SCOPED_PTR_H_
|
|
||||||
|
|
@ -1,279 +0,0 @@
|
||||||
// Copyright (c) 2007, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_SIMPLE_STRING_DICTIONARY_H_
|
|
||||||
#define COMMON_SIMPLE_STRING_DICTIONARY_H_
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "common/basictypes.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
// Opaque type for the serialized representation of a NonAllocatingMap. One is
|
|
||||||
// created in NonAllocatingMap::Serialize and can be deserialized using one of
|
|
||||||
// the constructors.
|
|
||||||
struct SerializedNonAllocatingMap;
|
|
||||||
|
|
||||||
// NonAllocatingMap is an implementation of a map/dictionary collection that
|
|
||||||
// uses a fixed amount of storage, so that it does not perform any dynamic
|
|
||||||
// allocations for its operations.
|
|
||||||
//
|
|
||||||
// The actual map storage (the Entry) is guaranteed to be POD, so that it can
|
|
||||||
// be transmitted over various IPC mechanisms.
|
|
||||||
//
|
|
||||||
// The template parameters control the amount of storage used for the key,
|
|
||||||
// value, and map. The KeySize and ValueSize are measured in bytes, not glyphs,
|
|
||||||
// and includes space for a \0 byte. This gives space for KeySize-1 and
|
|
||||||
// ValueSize-1 characters in an entry. NumEntries is the total number of
|
|
||||||
// entries that will fit in the map.
|
|
||||||
template <size_t KeySize, size_t ValueSize, size_t NumEntries>
|
|
||||||
class NonAllocatingMap {
|
|
||||||
public:
|
|
||||||
// Constant and publicly accessible versions of the template parameters.
|
|
||||||
static const size_t key_size = KeySize;
|
|
||||||
static const size_t value_size = ValueSize;
|
|
||||||
static const size_t num_entries = NumEntries;
|
|
||||||
|
|
||||||
// An Entry object is a single entry in the map. If the key is a 0-length
|
|
||||||
// NUL-terminated string, the entry is empty.
|
|
||||||
struct Entry {
|
|
||||||
char key[KeySize];
|
|
||||||
char value[ValueSize];
|
|
||||||
|
|
||||||
bool is_active() const {
|
|
||||||
return key[0] != '\0';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// An Iterator can be used to iterate over all the active entries in a
|
|
||||||
// NonAllocatingMap.
|
|
||||||
class Iterator {
|
|
||||||
public:
|
|
||||||
explicit Iterator(const NonAllocatingMap& map)
|
|
||||||
: map_(map),
|
|
||||||
current_(0) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the next entry in the map, or NULL if at the end of the
|
|
||||||
// collection.
|
|
||||||
const Entry* Next() {
|
|
||||||
while (current_ < map_.num_entries) {
|
|
||||||
const Entry* entry = &map_.entries_[current_++];
|
|
||||||
if (entry->is_active()) {
|
|
||||||
return entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
const NonAllocatingMap& map_;
|
|
||||||
size_t current_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(Iterator);
|
|
||||||
};
|
|
||||||
|
|
||||||
NonAllocatingMap() : entries_() {
|
|
||||||
}
|
|
||||||
|
|
||||||
NonAllocatingMap(const NonAllocatingMap& other) {
|
|
||||||
*this = other;
|
|
||||||
}
|
|
||||||
|
|
||||||
NonAllocatingMap& operator=(const NonAllocatingMap& other) {
|
|
||||||
assert(other.key_size == key_size);
|
|
||||||
assert(other.value_size == value_size);
|
|
||||||
assert(other.num_entries == num_entries);
|
|
||||||
if (other.key_size == key_size && other.value_size == value_size &&
|
|
||||||
other.num_entries == num_entries) {
|
|
||||||
memcpy(entries_, other.entries_, sizeof(entries_));
|
|
||||||
}
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Constructs a map from its serialized form. |map| should be the out
|
|
||||||
// parameter from Serialize() and |size| should be its return value.
|
|
||||||
NonAllocatingMap(const SerializedNonAllocatingMap* map, size_t size) {
|
|
||||||
assert(size == sizeof(entries_));
|
|
||||||
if (size == sizeof(entries_)) {
|
|
||||||
memcpy(entries_, map, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the number of active key/value pairs. The upper limit for this
|
|
||||||
// is NumEntries.
|
|
||||||
size_t GetCount() const {
|
|
||||||
size_t count = 0;
|
|
||||||
for (size_t i = 0; i < num_entries; ++i) {
|
|
||||||
if (entries_[i].is_active()) {
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Given |key|, returns its corresponding |value|. |key| must not be NULL. If
|
|
||||||
// the key is not found, NULL is returned.
|
|
||||||
const char* GetValueForKey(const char* key) const {
|
|
||||||
assert(key);
|
|
||||||
if (!key)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
size_t index = GetEntryIndexForKey(key);
|
|
||||||
if (index == num_entries)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return entries_[index].value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stores |value| into |key|, replacing the existing value if |key| is
|
|
||||||
// already present. |key| must not be NULL. If |value| is NULL, the key is
|
|
||||||
// removed from the map. If there is no more space in the map, then the
|
|
||||||
// operation silently fails. Returns an index into the map that can be used
|
|
||||||
// to quickly access the entry, or |num_entries| on failure or when clearing
|
|
||||||
// a key with a null value.
|
|
||||||
size_t SetKeyValue(const char* key, const char* value) {
|
|
||||||
if (!value) {
|
|
||||||
RemoveKey(key);
|
|
||||||
return num_entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(key);
|
|
||||||
if (!key)
|
|
||||||
return num_entries;
|
|
||||||
|
|
||||||
// Key must not be an empty string.
|
|
||||||
assert(key[0] != '\0');
|
|
||||||
if (key[0] == '\0')
|
|
||||||
return num_entries;
|
|
||||||
|
|
||||||
size_t entry_index = GetEntryIndexForKey(key);
|
|
||||||
|
|
||||||
// If it does not yet exist, attempt to insert it.
|
|
||||||
if (entry_index == num_entries) {
|
|
||||||
for (size_t i = 0; i < num_entries; ++i) {
|
|
||||||
if (!entries_[i].is_active()) {
|
|
||||||
entry_index = i;
|
|
||||||
Entry* entry = &entries_[i];
|
|
||||||
|
|
||||||
strncpy(entry->key, key, key_size);
|
|
||||||
entry->key[key_size - 1] = '\0';
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the map is out of space, entry will be NULL.
|
|
||||||
if (entry_index == num_entries)
|
|
||||||
return num_entries;
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
// Sanity check that the key only appears once.
|
|
||||||
int count = 0;
|
|
||||||
for (size_t i = 0; i < num_entries; ++i) {
|
|
||||||
if (strncmp(entries_[i].key, key, key_size) == 0)
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
assert(count == 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
strncpy(entries_[entry_index].value, value, value_size);
|
|
||||||
entries_[entry_index].value[value_size - 1] = '\0';
|
|
||||||
|
|
||||||
return entry_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sets a value for a key that has already been set with SetKeyValue(), using
|
|
||||||
// the index returned from that function.
|
|
||||||
void SetValueAtIndex(size_t index, const char* value) {
|
|
||||||
assert(index < num_entries);
|
|
||||||
if (index >= num_entries)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Entry* entry = &entries_[index];
|
|
||||||
assert(entry->key[0] != '\0');
|
|
||||||
|
|
||||||
strncpy(entry->value, value, value_size);
|
|
||||||
entry->value[value_size - 1] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Given |key|, removes any associated value. |key| must not be NULL. If
|
|
||||||
// the key is not found, this is a noop. This invalidates the index
|
|
||||||
// returned by SetKeyValue().
|
|
||||||
bool RemoveKey(const char* key) {
|
|
||||||
assert(key);
|
|
||||||
if (!key)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return RemoveAtIndex(GetEntryIndexForKey(key));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Removes a value and key using an index that was returned from
|
|
||||||
// SetKeyValue(). After a call to this function, the index is invalidated.
|
|
||||||
bool RemoveAtIndex(size_t index) {
|
|
||||||
if (index >= num_entries)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
entries_[index].key[0] = '\0';
|
|
||||||
entries_[index].value[0] = '\0';
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Places a serialized version of the map into |map| and returns the size.
|
|
||||||
// Both of these should be passed to the deserializing constructor. Note that
|
|
||||||
// the serialized |map| is scoped to the lifetime of the non-serialized
|
|
||||||
// instance of this class. The |map| can be copied across IPC boundaries.
|
|
||||||
size_t Serialize(const SerializedNonAllocatingMap** map) const {
|
|
||||||
*map = reinterpret_cast<const SerializedNonAllocatingMap*>(entries_);
|
|
||||||
return sizeof(entries_);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
size_t GetEntryIndexForKey(const char* key) const {
|
|
||||||
for (size_t i = 0; i < num_entries; ++i) {
|
|
||||||
if (strncmp(key, entries_[i].key, key_size) == 0) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return num_entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
Entry entries_[NumEntries];
|
|
||||||
};
|
|
||||||
|
|
||||||
// For historical reasons this specialized version is available with the same
|
|
||||||
// size factors as a previous implementation.
|
|
||||||
typedef NonAllocatingMap<256, 256, 64> SimpleStringDictionary;
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_SIMPLE_STRING_DICTIONARY_H_
|
|
||||||
|
|
@ -1,325 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// stabs_reader.h: Define StabsReader, a parser for STABS debugging
|
|
||||||
// information. A description of the STABS debugging format can be
|
|
||||||
// found at:
|
|
||||||
//
|
|
||||||
// http://sourceware.org/gdb/current/onlinedocs/stabs_toc.html
|
|
||||||
//
|
|
||||||
// The comments here assume you understand the format.
|
|
||||||
//
|
|
||||||
// This parser can handle big-endian and little-endian data, and the symbol
|
|
||||||
// values may be either 32 or 64 bits long. It handles both STABS in
|
|
||||||
// sections (as used on Linux) and STABS appearing directly in an
|
|
||||||
// a.out-like symbol table (as used in Darwin OS X Mach-O files).
|
|
||||||
|
|
||||||
#ifndef COMMON_STABS_READER_H__
|
|
||||||
#define COMMON_STABS_READER_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_MACH_O_NLIST_H
|
|
||||||
#include <mach-o/nlist.h>
|
|
||||||
#elif defined(HAVE_A_OUT_H)
|
|
||||||
#include <a.out.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/byte_cursor.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
class StabsHandler;
|
|
||||||
|
|
||||||
class StabsReader {
|
|
||||||
public:
|
|
||||||
// Create a reader for the STABS debug information whose .stab section is
|
|
||||||
// being traversed by ITERATOR, and whose .stabstr section is referred to
|
|
||||||
// by STRINGS. The reader will call the member functions of HANDLER to
|
|
||||||
// report the information it finds, when the reader's 'Process' member
|
|
||||||
// function is called.
|
|
||||||
//
|
|
||||||
// BIG_ENDIAN should be true if the entries in the .stab section are in
|
|
||||||
// big-endian form, or false if they are in little-endian form.
|
|
||||||
//
|
|
||||||
// VALUE_SIZE should be either 4 or 8, indicating the size of the 'value'
|
|
||||||
// field in each entry in bytes.
|
|
||||||
//
|
|
||||||
// UNITIZED should be true if the STABS data is stored in units with
|
|
||||||
// N_UNDF headers. This is usually the case for STABS stored in sections,
|
|
||||||
// like .stab/.stabstr, and usually not the case for STABS stored in the
|
|
||||||
// actual symbol table; UNITIZED should be true when parsing Linux stabs,
|
|
||||||
// false when parsing Mac OS X STABS. For details, see:
|
|
||||||
// http://sourceware.org/gdb/current/onlinedocs/stabs/Stab-Section-Basics.html
|
|
||||||
//
|
|
||||||
// Note that, in ELF, the .stabstr section should be found using the
|
|
||||||
// 'sh_link' field of the .stab section header, not by name.
|
|
||||||
StabsReader(const uint8_t *stab, size_t stab_size,
|
|
||||||
const uint8_t *stabstr, size_t stabstr_size,
|
|
||||||
bool big_endian, size_t value_size, bool unitized,
|
|
||||||
StabsHandler *handler);
|
|
||||||
|
|
||||||
// Process the STABS data, calling the handler's member functions to
|
|
||||||
// report what we find. While the handler functions return true,
|
|
||||||
// continue to process until we reach the end of the section. If we
|
|
||||||
// processed the entire section and all handlers returned true,
|
|
||||||
// return true. If any handler returned false, return false.
|
|
||||||
//
|
|
||||||
// This is only meant to be called once per StabsReader instance;
|
|
||||||
// resuming a prior processing pass that stopped abruptly isn't supported.
|
|
||||||
bool Process();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
// An class for walking arrays of STABS entries. This isolates the main
|
|
||||||
// STABS reader from the exact format (size; endianness) of the entries
|
|
||||||
// themselves.
|
|
||||||
class EntryIterator {
|
|
||||||
public:
|
|
||||||
// The contents of a STABS entry, adjusted for the host's endianness,
|
|
||||||
// word size, 'struct nlist' layout, and so on.
|
|
||||||
struct Entry {
|
|
||||||
// True if this iterator has reached the end of the entry array. When
|
|
||||||
// this is set, the other members of this structure are not valid.
|
|
||||||
bool at_end;
|
|
||||||
|
|
||||||
// The number of this entry within the list.
|
|
||||||
size_t index;
|
|
||||||
|
|
||||||
// The current entry's name offset. This is the offset within the
|
|
||||||
// current compilation unit's strings, as establish by the N_UNDF entries.
|
|
||||||
size_t name_offset;
|
|
||||||
|
|
||||||
// The current entry's type, 'other' field, descriptor, and value.
|
|
||||||
unsigned char type;
|
|
||||||
unsigned char other;
|
|
||||||
short descriptor;
|
|
||||||
uint64_t value;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create a EntryIterator walking the entries in BUFFER. Treat the
|
|
||||||
// entries as big-endian if BIG_ENDIAN is true, as little-endian
|
|
||||||
// otherwise. Assume each entry has a 'value' field whose size is
|
|
||||||
// VALUE_SIZE.
|
|
||||||
//
|
|
||||||
// This would not be terribly clean to extend to other format variations,
|
|
||||||
// but it's enough to handle Linux and Mac, and we'd like STABS to die
|
|
||||||
// anyway.
|
|
||||||
//
|
|
||||||
// For the record: on Linux, STABS entry values are always 32 bits,
|
|
||||||
// regardless of the architecture address size (don't ask me why); on
|
|
||||||
// Mac, they are 32 or 64 bits long. Oddly, the section header's entry
|
|
||||||
// size for a Linux ELF .stab section varies according to the ELF class
|
|
||||||
// from 12 to 20 even as the actual entries remain unchanged.
|
|
||||||
EntryIterator(const ByteBuffer *buffer, bool big_endian, size_t value_size);
|
|
||||||
|
|
||||||
// Move to the next entry. This function's behavior is undefined if
|
|
||||||
// at_end() is true when it is called.
|
|
||||||
EntryIterator &operator++() { Fetch(); entry_.index++; return *this; }
|
|
||||||
|
|
||||||
// Dereferencing this iterator produces a reference to an Entry structure
|
|
||||||
// that holds the current entry's values. The entry is owned by this
|
|
||||||
// EntryIterator, and will be invalidated at the next call to operator++.
|
|
||||||
const Entry &operator*() const { return entry_; }
|
|
||||||
const Entry *operator->() const { return &entry_; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Read the STABS entry at cursor_, and set entry_ appropriately.
|
|
||||||
void Fetch();
|
|
||||||
|
|
||||||
// The size of entries' value field, in bytes.
|
|
||||||
size_t value_size_;
|
|
||||||
|
|
||||||
// A byte cursor traversing buffer_.
|
|
||||||
ByteCursor cursor_;
|
|
||||||
|
|
||||||
// Values for the entry this iterator refers to.
|
|
||||||
Entry entry_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// A source line, saved to be reported later.
|
|
||||||
struct Line {
|
|
||||||
uint64_t address;
|
|
||||||
const char *filename;
|
|
||||||
int number;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Return the name of the current symbol.
|
|
||||||
const char *SymbolString();
|
|
||||||
|
|
||||||
// Process a compilation unit starting at symbol_. Return true
|
|
||||||
// to continue processing, or false to abort.
|
|
||||||
bool ProcessCompilationUnit();
|
|
||||||
|
|
||||||
// Process a function in current_source_file_ starting at symbol_.
|
|
||||||
// Return true to continue processing, or false to abort.
|
|
||||||
bool ProcessFunction();
|
|
||||||
|
|
||||||
// Process an exported function symbol.
|
|
||||||
// Return true to continue processing, or false to abort.
|
|
||||||
bool ProcessExtern();
|
|
||||||
|
|
||||||
// The STABS entries being parsed.
|
|
||||||
ByteBuffer entries_;
|
|
||||||
|
|
||||||
// The string section to which the entries refer.
|
|
||||||
ByteBuffer strings_;
|
|
||||||
|
|
||||||
// The iterator walking the STABS entries.
|
|
||||||
EntryIterator iterator_;
|
|
||||||
|
|
||||||
// True if the data is "unitized"; see the explanation in the comment for
|
|
||||||
// StabsReader::StabsReader.
|
|
||||||
bool unitized_;
|
|
||||||
|
|
||||||
StabsHandler *handler_;
|
|
||||||
|
|
||||||
// The offset of the current compilation unit's strings within stabstr_.
|
|
||||||
size_t string_offset_;
|
|
||||||
|
|
||||||
// The value string_offset_ should have for the next compilation unit,
|
|
||||||
// as established by N_UNDF entries.
|
|
||||||
size_t next_cu_string_offset_;
|
|
||||||
|
|
||||||
// The current source file name.
|
|
||||||
const char *current_source_file_;
|
|
||||||
|
|
||||||
// Mac OS X STABS place SLINE records before functions; we accumulate a
|
|
||||||
// vector of these until we see the FUN record, and then report them
|
|
||||||
// after the StartFunction call.
|
|
||||||
std::vector<Line> queued_lines_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Consumer-provided callback structure for the STABS reader. Clients
|
|
||||||
// of the STABS reader provide an instance of this structure. The
|
|
||||||
// reader then invokes the member functions of that instance to report
|
|
||||||
// the information it finds.
|
|
||||||
//
|
|
||||||
// The default definitions of the member functions do nothing, and return
|
|
||||||
// true so processing will continue.
|
|
||||||
class StabsHandler {
|
|
||||||
public:
|
|
||||||
StabsHandler() { }
|
|
||||||
virtual ~StabsHandler() { }
|
|
||||||
|
|
||||||
// Some general notes about the handler callback functions:
|
|
||||||
|
|
||||||
// Processing proceeds until the end of the .stabs section, or until
|
|
||||||
// one of these functions returns false.
|
|
||||||
|
|
||||||
// The addresses given are as reported in the STABS info, without
|
|
||||||
// regard for whether the module may be loaded at different
|
|
||||||
// addresses at different times (a shared library, say). When
|
|
||||||
// processing STABS from an ELF shared library, the addresses given
|
|
||||||
// all assume the library is loaded at its nominal load address.
|
|
||||||
// They are *not* offsets from the nominal load address. If you
|
|
||||||
// want offsets, you must subtract off the library's nominal load
|
|
||||||
// address.
|
|
||||||
|
|
||||||
// The arguments to these functions named FILENAME are all
|
|
||||||
// references to strings stored in the .stabstr section. Because
|
|
||||||
// both the Linux and Solaris linkers factor out duplicate strings
|
|
||||||
// from the .stabstr section, the consumer can assume that if two
|
|
||||||
// FILENAME values are different addresses, they represent different
|
|
||||||
// file names.
|
|
||||||
//
|
|
||||||
// Thus, it's safe to use (say) std::map<char *, ...>, which does
|
|
||||||
// string address comparisons, not string content comparisons.
|
|
||||||
// Since all the strings are in same array of characters --- the
|
|
||||||
// .stabstr section --- comparing their addresses produces
|
|
||||||
// predictable, if not lexicographically meaningful, results.
|
|
||||||
|
|
||||||
// Begin processing a compilation unit whose main source file is
|
|
||||||
// named FILENAME, and whose base address is ADDRESS. If
|
|
||||||
// BUILD_DIRECTORY is non-NULL, it is the name of the build
|
|
||||||
// directory in which the compilation occurred.
|
|
||||||
virtual bool StartCompilationUnit(const char *filename, uint64_t address,
|
|
||||||
const char *build_directory) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finish processing the compilation unit. If ADDRESS is non-zero,
|
|
||||||
// it is the ending address of the compilation unit. If ADDRESS is
|
|
||||||
// zero, then the compilation unit's ending address is not
|
|
||||||
// available, and the consumer must infer it by other means.
|
|
||||||
virtual bool EndCompilationUnit(uint64_t address) { return true; }
|
|
||||||
|
|
||||||
// Begin processing a function named NAME, whose starting address is
|
|
||||||
// ADDRESS. This function belongs to the compilation unit that was
|
|
||||||
// most recently started but not ended.
|
|
||||||
//
|
|
||||||
// Note that, unlike filenames, NAME is not a pointer into the
|
|
||||||
// .stabstr section; this is because the name as it appears in the
|
|
||||||
// STABS data is followed by type information. The value passed to
|
|
||||||
// StartFunction is the function name alone.
|
|
||||||
//
|
|
||||||
// In languages that use name mangling, like C++, NAME is mangled.
|
|
||||||
virtual bool StartFunction(const string &name, uint64_t address) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finish processing the function. If ADDRESS is non-zero, it is
|
|
||||||
// the ending address for the function. If ADDRESS is zero, then
|
|
||||||
// the function's ending address is not available, and the consumer
|
|
||||||
// must infer it by other means.
|
|
||||||
virtual bool EndFunction(uint64_t address) { return true; }
|
|
||||||
|
|
||||||
// Report that the code at ADDRESS is attributable to line NUMBER of
|
|
||||||
// the source file named FILENAME. The caller must infer the ending
|
|
||||||
// address of the line.
|
|
||||||
virtual bool Line(uint64_t address, const char *filename, int number) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Report that an exported function NAME is present at ADDRESS.
|
|
||||||
// The size of the function is unknown.
|
|
||||||
virtual bool Extern(const string &name, uint64_t address) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Report a warning. FORMAT is a printf-like format string,
|
|
||||||
// specifying how to format the subsequent arguments.
|
|
||||||
virtual void Warning(const char *format, ...) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_STABS_READER_H__
|
|
||||||
|
|
@ -1,143 +0,0 @@
|
||||||
// -*- mode: C++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// dump_stabs.h: Define the StabsToModule class, which receives
|
|
||||||
// STABS debugging information from a parser and adds it to a Breakpad
|
|
||||||
// symbol file.
|
|
||||||
|
|
||||||
#ifndef BREAKPAD_COMMON_STABS_TO_MODULE_H_
|
|
||||||
#define BREAKPAD_COMMON_STABS_TO_MODULE_H_
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/module.h"
|
|
||||||
#include "common/stabs_reader.h"
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
using std::vector;
|
|
||||||
|
|
||||||
// A StabsToModule is a handler that receives parsed STABS debugging
|
|
||||||
// information from a StabsReader, and uses that to populate
|
|
||||||
// a Module. (All classes are in the google_breakpad namespace.) A
|
|
||||||
// Module represents the contents of a Breakpad symbol file, and knows
|
|
||||||
// how to write itself out as such. A StabsToModule thus acts as
|
|
||||||
// the bridge between STABS and Breakpad data.
|
|
||||||
// When processing Darwin Mach-O files, this also receives public linker
|
|
||||||
// symbols, like those found in system libraries.
|
|
||||||
class StabsToModule: public google_breakpad::StabsHandler {
|
|
||||||
public:
|
|
||||||
// Receive parsed debugging information from a StabsReader, and
|
|
||||||
// store it all in MODULE.
|
|
||||||
StabsToModule(Module *module) :
|
|
||||||
module_(module),
|
|
||||||
in_compilation_unit_(false),
|
|
||||||
comp_unit_base_address_(0),
|
|
||||||
current_function_(NULL),
|
|
||||||
current_source_file_(NULL),
|
|
||||||
current_source_file_name_(NULL) { }
|
|
||||||
~StabsToModule();
|
|
||||||
|
|
||||||
// The standard StabsHandler virtual member functions.
|
|
||||||
bool StartCompilationUnit(const char *name, uint64_t address,
|
|
||||||
const char *build_directory);
|
|
||||||
bool EndCompilationUnit(uint64_t address);
|
|
||||||
bool StartFunction(const string &name, uint64_t address);
|
|
||||||
bool EndFunction(uint64_t address);
|
|
||||||
bool Line(uint64_t address, const char *name, int number);
|
|
||||||
bool Extern(const string &name, uint64_t address);
|
|
||||||
void Warning(const char *format, ...);
|
|
||||||
|
|
||||||
// Do any final processing necessary to make module_ contain all the
|
|
||||||
// data provided by the STABS reader.
|
|
||||||
//
|
|
||||||
// Because STABS does not provide reliable size information for
|
|
||||||
// functions and lines, we need to make a pass over the data after
|
|
||||||
// processing all the STABS to compute those sizes. We take care of
|
|
||||||
// that here.
|
|
||||||
void Finalize();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
// An arbitrary, but very large, size to use for functions whose
|
|
||||||
// size we can't compute properly.
|
|
||||||
static const uint64_t kFallbackSize = 0x10000000;
|
|
||||||
|
|
||||||
// The module we're contributing debugging info to.
|
|
||||||
Module *module_;
|
|
||||||
|
|
||||||
// The functions we've generated so far. We don't add these to
|
|
||||||
// module_ as we parse them. Instead, we wait until we've computed
|
|
||||||
// their ending address, and their lines' ending addresses.
|
|
||||||
//
|
|
||||||
// We could just stick them in module_ from the outset, but if
|
|
||||||
// module_ already contains data gathered from other debugging
|
|
||||||
// formats, that would complicate the size computation.
|
|
||||||
vector<Module::Function *> functions_;
|
|
||||||
|
|
||||||
// Boundary addresses. STABS doesn't necessarily supply sizes for
|
|
||||||
// functions and lines, so we need to compute them ourselves by
|
|
||||||
// finding the next object.
|
|
||||||
vector<Module::Address> boundaries_;
|
|
||||||
|
|
||||||
// True if we are currently within a compilation unit: we have gotten a
|
|
||||||
// StartCompilationUnit call, but no matching EndCompilationUnit call
|
|
||||||
// yet. We use this for sanity checks.
|
|
||||||
bool in_compilation_unit_;
|
|
||||||
|
|
||||||
// The base address of the current compilation unit. We use this to
|
|
||||||
// recognize functions we should omit from the symbol file. (If you
|
|
||||||
// know the details of why we omit these, please patch this
|
|
||||||
// comment.)
|
|
||||||
Module::Address comp_unit_base_address_;
|
|
||||||
|
|
||||||
// The function we're currently contributing lines to.
|
|
||||||
Module::Function *current_function_;
|
|
||||||
|
|
||||||
// The last Module::File we got a line number in.
|
|
||||||
Module::File *current_source_file_;
|
|
||||||
|
|
||||||
// The pointer in the .stabstr section of the name that
|
|
||||||
// current_source_file_ is built from. This allows us to quickly
|
|
||||||
// recognize when the current line is in the same file as the
|
|
||||||
// previous one (which it usually is).
|
|
||||||
const char *current_source_file_name_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // BREAKPAD_COMMON_STABS_TO_MODULE_H_
|
|
||||||
|
|
@ -1,43 +0,0 @@
|
||||||
// Copyright (c) 2016, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && MSC_VER < 1900
|
|
||||||
#include <basetsd.h>
|
|
||||||
|
|
||||||
#define snprintf _snprintf
|
|
||||||
typedef SSIZE_T ssize_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
// Copyright (c) 2006, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// string_conversion.h: Conversion between different UTF-8/16/32 encodings.
|
|
||||||
|
|
||||||
#ifndef COMMON_STRING_CONVERSION_H__
|
|
||||||
#define COMMON_STRING_CONVERSION_H__
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
using std::vector;
|
|
||||||
|
|
||||||
// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the
|
|
||||||
// conversion failed, |out| will be zero length.
|
|
||||||
void UTF8ToUTF16(const char *in, vector<uint16_t> *out);
|
|
||||||
|
|
||||||
// Convert at least one character (up to a maximum of |in_length|) from |in|
|
|
||||||
// to UTF-16 into |out|. Return the number of characters consumed from |in|.
|
|
||||||
// Any unused characters in |out| will be initialized to 0. No memory will
|
|
||||||
// be allocated by this routine.
|
|
||||||
int UTF8ToUTF16Char(const char *in, int in_length, uint16_t out[2]);
|
|
||||||
|
|
||||||
// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the
|
|
||||||
// conversion failed, |out| will be zero length.
|
|
||||||
void UTF32ToUTF16(const wchar_t *in, vector<uint16_t> *out);
|
|
||||||
|
|
||||||
// Convert |in| to UTF-16 into |out|. Any unused characters in |out| will be
|
|
||||||
// initialized to 0. No memory will be allocated by this routine.
|
|
||||||
void UTF32ToUTF16Char(wchar_t in, uint16_t out[2]);
|
|
||||||
|
|
||||||
// Convert |in| to UTF-8. If |swap| is true, swap bytes before converting.
|
|
||||||
string UTF16ToUTF8(const vector<uint16_t> &in, bool swap);
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // COMMON_STRING_CONVERSION_H__
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
||||||
// -*- mode: c++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2013 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef COMMON_SYMBOL_DATA_H_
|
|
||||||
#define COMMON_SYMBOL_DATA_H_
|
|
||||||
|
|
||||||
// Control what data is used from the symbol file.
|
|
||||||
enum SymbolData {
|
|
||||||
ALL_SYMBOL_DATA,
|
|
||||||
NO_CFI,
|
|
||||||
ONLY_CFI
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // COMMON_SYMBOL_DATA_H_
|
|
||||||
|
|
@ -1,484 +0,0 @@
|
||||||
// -*- mode: C++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2010, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
|
|
||||||
|
|
||||||
// test-assembler.h: interface to class for building complex binary streams.
|
|
||||||
|
|
||||||
// To test the Breakpad symbol dumper and processor thoroughly, for
|
|
||||||
// all combinations of host system and minidump processor
|
|
||||||
// architecture, we need to be able to easily generate complex test
|
|
||||||
// data like debugging information and minidump files.
|
|
||||||
//
|
|
||||||
// For example, if we want our unit tests to provide full code
|
|
||||||
// coverage for stack walking, it may be difficult to persuade the
|
|
||||||
// compiler to generate every possible sort of stack walking
|
|
||||||
// information that we want to support; there are probably DWARF CFI
|
|
||||||
// opcodes that GCC never emits. Similarly, if we want to test our
|
|
||||||
// error handling, we will need to generate damaged minidumps or
|
|
||||||
// debugging information that (we hope) the client or compiler will
|
|
||||||
// never produce on its own.
|
|
||||||
//
|
|
||||||
// google_breakpad::TestAssembler provides a predictable and
|
|
||||||
// (relatively) simple way to generate complex formatted data streams
|
|
||||||
// like minidumps and CFI. Furthermore, because TestAssembler is
|
|
||||||
// portable, developers without access to (say) Visual Studio or a
|
|
||||||
// SPARC assembler can still work on test data for those targets.
|
|
||||||
|
|
||||||
#ifndef PROCESSOR_TEST_ASSEMBLER_H_
|
|
||||||
#define PROCESSOR_TEST_ASSEMBLER_H_
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "common/using_std_string.h"
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
using std::list;
|
|
||||||
using std::vector;
|
|
||||||
|
|
||||||
namespace test_assembler {
|
|
||||||
|
|
||||||
// A Label represents a value not yet known that we need to store in a
|
|
||||||
// section. As long as all the labels a section refers to are defined
|
|
||||||
// by the time we retrieve its contents as bytes, we can use undefined
|
|
||||||
// labels freely in that section's construction.
|
|
||||||
//
|
|
||||||
// A label can be in one of three states:
|
|
||||||
// - undefined,
|
|
||||||
// - defined as the sum of some other label and a constant, or
|
|
||||||
// - a constant.
|
|
||||||
//
|
|
||||||
// A label's value never changes, but it can accumulate constraints.
|
|
||||||
// Adding labels and integers is permitted, and yields a label.
|
|
||||||
// Subtracting a constant from a label is permitted, and also yields a
|
|
||||||
// label. Subtracting two labels that have some relationship to each
|
|
||||||
// other is permitted, and yields a constant.
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
//
|
|
||||||
// Label a; // a's value is undefined
|
|
||||||
// Label b; // b's value is undefined
|
|
||||||
// {
|
|
||||||
// Label c = a + 4; // okay, even though a's value is unknown
|
|
||||||
// b = c + 4; // also okay; b is now a+8
|
|
||||||
// }
|
|
||||||
// Label d = b - 2; // okay; d == a+6, even though c is gone
|
|
||||||
// d.Value(); // error: d's value is not yet known
|
|
||||||
// d - a; // is 6, even though their values are not known
|
|
||||||
// a = 12; // now b == 20, and d == 18
|
|
||||||
// d.Value(); // 18: no longer an error
|
|
||||||
// b.Value(); // 20
|
|
||||||
// d = 10; // error: d is already defined.
|
|
||||||
//
|
|
||||||
// Label objects' lifetimes are unconstrained: notice that, in the
|
|
||||||
// above example, even though a and b are only related through c, and
|
|
||||||
// c goes out of scope, the assignment to a sets b's value as well. In
|
|
||||||
// particular, it's not necessary to ensure that a Label lives beyond
|
|
||||||
// Sections that refer to it.
|
|
||||||
class Label {
|
|
||||||
public:
|
|
||||||
Label(); // An undefined label.
|
|
||||||
Label(uint64_t value); // A label with a fixed value
|
|
||||||
Label(const Label &value); // A label equal to another.
|
|
||||||
~Label();
|
|
||||||
|
|
||||||
// Return this label's value; it must be known.
|
|
||||||
//
|
|
||||||
// Providing this as a cast operator is nifty, but the conversions
|
|
||||||
// happen in unexpected places. In particular, ISO C++ says that
|
|
||||||
// Label + size_t becomes ambigious, because it can't decide whether
|
|
||||||
// to convert the Label to a uint64_t and then to a size_t, or use
|
|
||||||
// the overloaded operator that returns a new label, even though the
|
|
||||||
// former could fail if the label is not yet defined and the latter won't.
|
|
||||||
uint64_t Value() const;
|
|
||||||
|
|
||||||
Label &operator=(uint64_t value);
|
|
||||||
Label &operator=(const Label &value);
|
|
||||||
Label operator+(uint64_t addend) const;
|
|
||||||
Label operator-(uint64_t subtrahend) const;
|
|
||||||
uint64_t operator-(const Label &subtrahend) const;
|
|
||||||
|
|
||||||
// We could also provide == and != that work on undefined, but
|
|
||||||
// related, labels.
|
|
||||||
|
|
||||||
// Return true if this label's value is known. If VALUE_P is given,
|
|
||||||
// set *VALUE_P to the known value if returning true.
|
|
||||||
bool IsKnownConstant(uint64_t *value_p = NULL) const;
|
|
||||||
|
|
||||||
// Return true if the offset from LABEL to this label is known. If
|
|
||||||
// OFFSET_P is given, set *OFFSET_P to the offset when returning true.
|
|
||||||
//
|
|
||||||
// You can think of l.KnownOffsetFrom(m, &d) as being like 'd = l-m',
|
|
||||||
// except that it also returns a value indicating whether the
|
|
||||||
// subtraction is possible given what we currently know of l and m.
|
|
||||||
// It can be possible even if we don't know l and m's values. For
|
|
||||||
// example:
|
|
||||||
//
|
|
||||||
// Label l, m;
|
|
||||||
// m = l + 10;
|
|
||||||
// l.IsKnownConstant(); // false
|
|
||||||
// m.IsKnownConstant(); // false
|
|
||||||
// uint64_t d;
|
|
||||||
// l.IsKnownOffsetFrom(m, &d); // true, and sets d to -10.
|
|
||||||
// l-m // -10
|
|
||||||
// m-l // 10
|
|
||||||
// m.Value() // error: m's value is not known
|
|
||||||
bool IsKnownOffsetFrom(const Label &label, uint64_t *offset_p = NULL) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// A label's value, or if that is not yet known, how the value is
|
|
||||||
// related to other labels' values. A binding may be:
|
|
||||||
// - a known constant,
|
|
||||||
// - constrained to be equal to some other binding plus a constant, or
|
|
||||||
// - unconstrained, and free to take on any value.
|
|
||||||
//
|
|
||||||
// Many labels may point to a single binding, and each binding may
|
|
||||||
// refer to another, so bindings and labels form trees whose leaves
|
|
||||||
// are labels, whose interior nodes (and roots) are bindings, and
|
|
||||||
// where links point from children to parents. Bindings are
|
|
||||||
// reference counted, allowing labels to be lightweight, copyable,
|
|
||||||
// assignable, placed in containers, and so on.
|
|
||||||
class Binding {
|
|
||||||
public:
|
|
||||||
Binding();
|
|
||||||
Binding(uint64_t addend);
|
|
||||||
~Binding();
|
|
||||||
|
|
||||||
// Increment our reference count.
|
|
||||||
void Acquire() { reference_count_++; };
|
|
||||||
// Decrement our reference count, and return true if it is zero.
|
|
||||||
bool Release() { return --reference_count_ == 0; }
|
|
||||||
|
|
||||||
// Set this binding to be equal to BINDING + ADDEND. If BINDING is
|
|
||||||
// NULL, then set this binding to the known constant ADDEND.
|
|
||||||
// Update every binding on this binding's chain to point directly
|
|
||||||
// to BINDING, or to be a constant, with addends adjusted
|
|
||||||
// appropriately.
|
|
||||||
void Set(Binding *binding, uint64_t value);
|
|
||||||
|
|
||||||
// Return what we know about the value of this binding.
|
|
||||||
// - If this binding's value is a known constant, set BASE to
|
|
||||||
// NULL, and set ADDEND to its value.
|
|
||||||
// - If this binding is not a known constant but related to other
|
|
||||||
// bindings, set BASE to the binding at the end of the relation
|
|
||||||
// chain (which will always be unconstrained), and set ADDEND to the
|
|
||||||
// value to add to that binding's value to get this binding's
|
|
||||||
// value.
|
|
||||||
// - If this binding is unconstrained, set BASE to this, and leave
|
|
||||||
// ADDEND unchanged.
|
|
||||||
void Get(Binding **base, uint64_t *addend);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// There are three cases:
|
|
||||||
//
|
|
||||||
// - A binding representing a known constant value has base_ NULL,
|
|
||||||
// and addend_ equal to the value.
|
|
||||||
//
|
|
||||||
// - A binding representing a completely unconstrained value has
|
|
||||||
// base_ pointing to this; addend_ is unused.
|
|
||||||
//
|
|
||||||
// - A binding whose value is related to some other binding's
|
|
||||||
// value has base_ pointing to that other binding, and addend_
|
|
||||||
// set to the amount to add to that binding's value to get this
|
|
||||||
// binding's value. We only represent relationships of the form
|
|
||||||
// x = y+c.
|
|
||||||
//
|
|
||||||
// Thus, the bind_ links form a chain terminating in either a
|
|
||||||
// known constant value or a completely unconstrained value. Most
|
|
||||||
// operations on bindings do path compression: they change every
|
|
||||||
// binding on the chain to point directly to the final value,
|
|
||||||
// adjusting addends as appropriate.
|
|
||||||
Binding *base_;
|
|
||||||
uint64_t addend_;
|
|
||||||
|
|
||||||
// The number of Labels and Bindings pointing to this binding.
|
|
||||||
// (When a binding points to itself, indicating a completely
|
|
||||||
// unconstrained binding, that doesn't count as a reference.)
|
|
||||||
int reference_count_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// This label's value.
|
|
||||||
Binding *value_;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline Label operator+(uint64_t a, const Label &l) { return l + a; }
|
|
||||||
// Note that int-Label isn't defined, as negating a Label is not an
|
|
||||||
// operation we support.
|
|
||||||
|
|
||||||
// Conventions for representing larger numbers as sequences of bytes.
|
|
||||||
enum Endianness {
|
|
||||||
kBigEndian, // Big-endian: the most significant byte comes first.
|
|
||||||
kLittleEndian, // Little-endian: the least significant byte comes first.
|
|
||||||
kUnsetEndian, // used internally
|
|
||||||
};
|
|
||||||
|
|
||||||
// A section is a sequence of bytes, constructed by appending bytes
|
|
||||||
// to the end. Sections have a convenient and flexible set of member
|
|
||||||
// functions for appending data in various formats: big-endian and
|
|
||||||
// little-endian signed and unsigned values of different sizes;
|
|
||||||
// LEB128 and ULEB128 values (see below), and raw blocks of bytes.
|
|
||||||
//
|
|
||||||
// If you need to append a value to a section that is not convenient
|
|
||||||
// to compute immediately, you can create a label, append the
|
|
||||||
// label's value to the section, and then set the label's value
|
|
||||||
// later, when it's convenient to do so. Once a label's value is
|
|
||||||
// known, the section class takes care of updating all previously
|
|
||||||
// appended references to it.
|
|
||||||
//
|
|
||||||
// Once all the labels to which a section refers have had their
|
|
||||||
// values determined, you can get a copy of the section's contents
|
|
||||||
// as a string.
|
|
||||||
//
|
|
||||||
// Note that there is no specified "start of section" label. This is
|
|
||||||
// because there are typically several different meanings for "the
|
|
||||||
// start of a section": the offset of the section within an object
|
|
||||||
// file, the address in memory at which the section's content appear,
|
|
||||||
// and so on. It's up to the code that uses the Section class to
|
|
||||||
// keep track of these explicitly, as they depend on the application.
|
|
||||||
class Section {
|
|
||||||
public:
|
|
||||||
Section(Endianness endianness = kUnsetEndian)
|
|
||||||
: endianness_(endianness) { };
|
|
||||||
|
|
||||||
// A base class destructor should be either public and virtual,
|
|
||||||
// or protected and nonvirtual.
|
|
||||||
virtual ~Section() { };
|
|
||||||
|
|
||||||
// Set the default endianness of this section to ENDIANNESS. This
|
|
||||||
// sets the behavior of the D<N> appending functions. If the
|
|
||||||
// assembler's default endianness was set, this is the
|
|
||||||
void set_endianness(Endianness endianness) {
|
|
||||||
endianness_ = endianness;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the default endianness of this section.
|
|
||||||
Endianness endianness() const { return endianness_; }
|
|
||||||
|
|
||||||
// Append the SIZE bytes at DATA or the contents of STRING to the
|
|
||||||
// end of this section. Return a reference to this section.
|
|
||||||
Section &Append(const uint8_t *data, size_t size) {
|
|
||||||
contents_.append(reinterpret_cast<const char *>(data), size);
|
|
||||||
return *this;
|
|
||||||
};
|
|
||||||
Section &Append(const string &data) {
|
|
||||||
contents_.append(data);
|
|
||||||
return *this;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Append SIZE copies of BYTE to the end of this section. Return a
|
|
||||||
// reference to this section.
|
|
||||||
Section &Append(size_t size, uint8_t byte) {
|
|
||||||
contents_.append(size, (char) byte);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append NUMBER to this section. ENDIANNESS is the endianness to
|
|
||||||
// use to write the number. SIZE is the length of the number in
|
|
||||||
// bytes. Return a reference to this section.
|
|
||||||
Section &Append(Endianness endianness, size_t size, uint64_t number);
|
|
||||||
Section &Append(Endianness endianness, size_t size, const Label &label);
|
|
||||||
|
|
||||||
// Append SECTION to the end of this section. The labels SECTION
|
|
||||||
// refers to need not be defined yet.
|
|
||||||
//
|
|
||||||
// Note that this has no effect on any Labels' values, or on
|
|
||||||
// SECTION. If placing SECTION within 'this' provides new
|
|
||||||
// constraints on existing labels' values, then it's up to the
|
|
||||||
// caller to fiddle with those labels as needed.
|
|
||||||
Section &Append(const Section §ion);
|
|
||||||
|
|
||||||
// Append the contents of DATA as a series of bytes terminated by
|
|
||||||
// a NULL character.
|
|
||||||
Section &AppendCString(const string &data) {
|
|
||||||
Append(data);
|
|
||||||
contents_ += '\0';
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append at most SIZE bytes from DATA; if DATA is less than SIZE bytes
|
|
||||||
// long, pad with '\0' characters.
|
|
||||||
Section &AppendCString(const string &data, size_t size) {
|
|
||||||
contents_.append(data, 0, size);
|
|
||||||
if (data.size() < size)
|
|
||||||
Append(size - data.size(), 0);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append VALUE or LABEL to this section, with the given bit width and
|
|
||||||
// endianness. Return a reference to this section.
|
|
||||||
//
|
|
||||||
// The names of these functions have the form <ENDIANNESS><BITWIDTH>:
|
|
||||||
// <ENDIANNESS> is either 'L' (little-endian, least significant byte first),
|
|
||||||
// 'B' (big-endian, most significant byte first), or
|
|
||||||
// 'D' (default, the section's default endianness)
|
|
||||||
// <BITWIDTH> is 8, 16, 32, or 64.
|
|
||||||
//
|
|
||||||
// Since endianness doesn't matter for a single byte, all the
|
|
||||||
// <BITWIDTH>=8 functions are equivalent.
|
|
||||||
//
|
|
||||||
// These can be used to write both signed and unsigned values, as
|
|
||||||
// the compiler will properly sign-extend a signed value before
|
|
||||||
// passing it to the function, at which point the function's
|
|
||||||
// behavior is the same either way.
|
|
||||||
Section &L8(uint8_t value) { contents_ += value; return *this; }
|
|
||||||
Section &B8(uint8_t value) { contents_ += value; return *this; }
|
|
||||||
Section &D8(uint8_t value) { contents_ += value; return *this; }
|
|
||||||
Section &L16(uint16_t), &L32(uint32_t), &L64(uint64_t),
|
|
||||||
&B16(uint16_t), &B32(uint32_t), &B64(uint64_t),
|
|
||||||
&D16(uint16_t), &D32(uint32_t), &D64(uint64_t);
|
|
||||||
Section &L8(const Label &label), &L16(const Label &label),
|
|
||||||
&L32(const Label &label), &L64(const Label &label),
|
|
||||||
&B8(const Label &label), &B16(const Label &label),
|
|
||||||
&B32(const Label &label), &B64(const Label &label),
|
|
||||||
&D8(const Label &label), &D16(const Label &label),
|
|
||||||
&D32(const Label &label), &D64(const Label &label);
|
|
||||||
|
|
||||||
// Append VALUE in a signed LEB128 (Little-Endian Base 128) form.
|
|
||||||
//
|
|
||||||
// The signed LEB128 representation of an integer N is a variable
|
|
||||||
// number of bytes:
|
|
||||||
//
|
|
||||||
// - If N is between -0x40 and 0x3f, then its signed LEB128
|
|
||||||
// representation is a single byte whose value is N.
|
|
||||||
//
|
|
||||||
// - Otherwise, its signed LEB128 representation is (N & 0x7f) |
|
|
||||||
// 0x80, followed by the signed LEB128 representation of N / 128,
|
|
||||||
// rounded towards negative infinity.
|
|
||||||
//
|
|
||||||
// In other words, we break VALUE into groups of seven bits, put
|
|
||||||
// them in little-endian order, and then write them as eight-bit
|
|
||||||
// bytes with the high bit on all but the last.
|
|
||||||
//
|
|
||||||
// Note that VALUE cannot be a Label (we would have to implement
|
|
||||||
// relaxation).
|
|
||||||
Section &LEB128(long long value);
|
|
||||||
|
|
||||||
// Append VALUE in unsigned LEB128 (Little-Endian Base 128) form.
|
|
||||||
//
|
|
||||||
// The unsigned LEB128 representation of an integer N is a variable
|
|
||||||
// number of bytes:
|
|
||||||
//
|
|
||||||
// - If N is between 0 and 0x7f, then its unsigned LEB128
|
|
||||||
// representation is a single byte whose value is N.
|
|
||||||
//
|
|
||||||
// - Otherwise, its unsigned LEB128 representation is (N & 0x7f) |
|
|
||||||
// 0x80, followed by the unsigned LEB128 representation of N /
|
|
||||||
// 128, rounded towards negative infinity.
|
|
||||||
//
|
|
||||||
// Note that VALUE cannot be a Label (we would have to implement
|
|
||||||
// relaxation).
|
|
||||||
Section &ULEB128(uint64_t value);
|
|
||||||
|
|
||||||
// Jump to the next location aligned on an ALIGNMENT-byte boundary,
|
|
||||||
// relative to the start of the section. Fill the gap with PAD_BYTE.
|
|
||||||
// ALIGNMENT must be a power of two. Return a reference to this
|
|
||||||
// section.
|
|
||||||
Section &Align(size_t alignment, uint8_t pad_byte = 0);
|
|
||||||
|
|
||||||
// Clear the contents of this section.
|
|
||||||
void Clear();
|
|
||||||
|
|
||||||
// Return the current size of the section.
|
|
||||||
size_t Size() const { return contents_.size(); }
|
|
||||||
|
|
||||||
// Return a label representing the start of the section.
|
|
||||||
//
|
|
||||||
// It is up to the user whether this label represents the section's
|
|
||||||
// position in an object file, the section's address in memory, or
|
|
||||||
// what have you; some applications may need both, in which case
|
|
||||||
// this simple-minded interface won't be enough. This class only
|
|
||||||
// provides a single start label, for use with the Here and Mark
|
|
||||||
// member functions.
|
|
||||||
//
|
|
||||||
// Ideally, we'd provide this in a subclass that actually knows more
|
|
||||||
// about the application at hand and can provide an appropriate
|
|
||||||
// collection of start labels. But then the appending member
|
|
||||||
// functions like Append and D32 would return a reference to the
|
|
||||||
// base class, not the derived class, and the chaining won't work.
|
|
||||||
// Since the only value here is in pretty notation, that's a fatal
|
|
||||||
// flaw.
|
|
||||||
Label start() const { return start_; }
|
|
||||||
|
|
||||||
// Return a label representing the point at which the next Appended
|
|
||||||
// item will appear in the section, relative to start().
|
|
||||||
Label Here() const { return start_ + Size(); }
|
|
||||||
|
|
||||||
// Set *LABEL to Here, and return a reference to this section.
|
|
||||||
Section &Mark(Label *label) { *label = Here(); return *this; }
|
|
||||||
|
|
||||||
// If there are no undefined label references left in this
|
|
||||||
// section, set CONTENTS to the contents of this section, as a
|
|
||||||
// string, and clear this section. Return true on success, or false
|
|
||||||
// if there were still undefined labels.
|
|
||||||
bool GetContents(string *contents);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Used internally. A reference to a label's value.
|
|
||||||
struct Reference {
|
|
||||||
Reference(size_t set_offset, Endianness set_endianness, size_t set_size,
|
|
||||||
const Label &set_label)
|
|
||||||
: offset(set_offset), endianness(set_endianness), size(set_size),
|
|
||||||
label(set_label) { }
|
|
||||||
|
|
||||||
// The offset of the reference within the section.
|
|
||||||
size_t offset;
|
|
||||||
|
|
||||||
// The endianness of the reference.
|
|
||||||
Endianness endianness;
|
|
||||||
|
|
||||||
// The size of the reference.
|
|
||||||
size_t size;
|
|
||||||
|
|
||||||
// The label to which this is a reference.
|
|
||||||
Label label;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The default endianness of this section.
|
|
||||||
Endianness endianness_;
|
|
||||||
|
|
||||||
// The contents of the section.
|
|
||||||
string contents_;
|
|
||||||
|
|
||||||
// References to labels within those contents.
|
|
||||||
vector<Reference> references_;
|
|
||||||
|
|
||||||
// A label referring to the beginning of the section.
|
|
||||||
Label start_;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace test_assembler
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // PROCESSOR_TEST_ASSEMBLER_H_
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
||||||
// Copyright (c) 2010 Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Include this file to use unordered_map and unordered_set. If tr1
|
|
||||||
// or C++11 is not available, you can switch to using hash_set and
|
|
||||||
// hash_map by defining BP_USE_HASH_SET.
|
|
||||||
|
|
||||||
#ifndef COMMON_UNORDERED_H_
|
|
||||||
#define COMMON_UNORDERED_H_
|
|
||||||
|
|
||||||
#if defined(BP_USE_HASH_SET)
|
|
||||||
#include <hash_map>
|
|
||||||
#include <hash_set>
|
|
||||||
|
|
||||||
// For hash<string>.
|
|
||||||
#include "util/hash/hash.h"
|
|
||||||
|
|
||||||
template <class T, class U, class H = __gnu_cxx::hash<T> >
|
|
||||||
struct unordered_map : public __gnu_cxx::hash_map<T, U, H> {};
|
|
||||||
template <class T, class H = __gnu_cxx::hash<T> >
|
|
||||||
struct unordered_set : public __gnu_cxx::hash_set<T, H> {};
|
|
||||||
|
|
||||||
#elif defined(_LIBCPP_VERSION) // c++11
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
using std::unordered_map;
|
|
||||||
using std::unordered_set;
|
|
||||||
|
|
||||||
#else // Fallback to tr1::unordered
|
|
||||||
#include <tr1/unordered_map>
|
|
||||||
#include <tr1/unordered_set>
|
|
||||||
using std::tr1::unordered_map;
|
|
||||||
using std::tr1::unordered_set;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // COMMON_UNORDERED_H_
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
// -*- mode: C++ -*-
|
|
||||||
|
|
||||||
// Copyright (c) 2012, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// Original author: Ivan Penkov
|
|
||||||
|
|
||||||
// using_std_string.h: Allows building this code in environments where
|
|
||||||
// global string (::string) exists.
|
|
||||||
//
|
|
||||||
// The problem:
|
|
||||||
// -------------
|
|
||||||
// Let's say you want to build this code in an environment where a global
|
|
||||||
// string type is defined (i.e. ::string). Now, let's suppose that ::string
|
|
||||||
// is different that std::string and you'd like to have the option to easily
|
|
||||||
// choose between the two string types. Ideally you'd like to control which
|
|
||||||
// string type is chosen by simply #defining an identifier.
|
|
||||||
//
|
|
||||||
// The solution:
|
|
||||||
// -------------
|
|
||||||
// #define HAS_GLOBAL_STRING somewhere in a global header file and then
|
|
||||||
// globally replace std::string with string. Then include this header
|
|
||||||
// file everywhere where string is used. If you want to revert back to
|
|
||||||
// using std::string, simply remove the #define (HAS_GLOBAL_STRING).
|
|
||||||
|
|
||||||
#ifndef THIRD_PARTY_BREAKPAD_SRC_COMMON_USING_STD_STRING_H_
|
|
||||||
#define THIRD_PARTY_BREAKPAD_SRC_COMMON_USING_STD_STRING_H_
|
|
||||||
|
|
||||||
#ifdef HAS_GLOBAL_STRING
|
|
||||||
typedef ::string google_breakpad_string;
|
|
||||||
#else
|
|
||||||
using std::string;
|
|
||||||
typedef std::string google_breakpad_string;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Inicates that type google_breakpad_string is defined
|
|
||||||
#define HAS_GOOGLE_BREAKPAD_STRING
|
|
||||||
|
|
||||||
#endif // THIRD_PARTY_BREAKPAD_SRC_COMMON_USING_STD_STRING_H_
|
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* breakpad_types.h: Precise-width types
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file ensures that types uintN_t are defined for N = 8, 16, 32, and
|
|
||||||
* 64. Types of precise widths are crucial to the task of writing data
|
|
||||||
* structures on one platform and reading them on another.
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai */
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__
|
|
||||||
|
|
||||||
#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && \
|
|
||||||
!defined(__STDC_FORMAT_MACROS)
|
|
||||||
#error "inttypes.h has already been included before this header file, but "
|
|
||||||
#error "without __STDC_FORMAT_MACROS defined."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __STDC_FORMAT_MACROS
|
|
||||||
#define __STDC_FORMAT_MACROS
|
|
||||||
#endif /* __STDC_FORMAT_MACROS */
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint64_t high;
|
|
||||||
uint64_t low;
|
|
||||||
} uint128_struct;
|
|
||||||
|
|
||||||
typedef uint64_t breakpad_time_t;
|
|
||||||
|
|
||||||
/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to
|
|
||||||
* llx, which is the format string for "long long" - this is a 64-bit
|
|
||||||
* integral type on many systems. */
|
|
||||||
#ifndef PRIx64
|
|
||||||
#define PRIx64 "llx"
|
|
||||||
#endif /* !PRIx64 */
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ */
|
|
||||||
|
|
@ -1,235 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on amd64. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by ensuring
|
|
||||||
* ensuring that all members are aligned on their natural boundaries. In
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* These definitions may be extended to support handling minidump files
|
|
||||||
* for other CPUs and other operating systems.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably in terms of interoperability with minidumps
|
|
||||||
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file. DbgHelp
|
|
||||||
* on Windows is assumed to be the reference implementation; this file
|
|
||||||
* seeks to provide a cross-platform compatible implementation. To avoid
|
|
||||||
* collisions with the types and values defined and used by DbgHelp in the
|
|
||||||
* event that this implementation is used on Windows, each type and value
|
|
||||||
* defined here is given a new name, beginning with "MD". Names of the
|
|
||||||
* equivalent types and values in the Windows Platform SDK are given in
|
|
||||||
* comments.
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai
|
|
||||||
* Change to split into its own file: Neal Sidhwaney */
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* AMD64 support, see WINNT.H
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t control_word;
|
|
||||||
uint16_t status_word;
|
|
||||||
uint8_t tag_word;
|
|
||||||
uint8_t reserved1;
|
|
||||||
uint16_t error_opcode;
|
|
||||||
uint32_t error_offset;
|
|
||||||
uint16_t error_selector;
|
|
||||||
uint16_t reserved2;
|
|
||||||
uint32_t data_offset;
|
|
||||||
uint16_t data_selector;
|
|
||||||
uint16_t reserved3;
|
|
||||||
uint32_t mx_csr;
|
|
||||||
uint32_t mx_csr_mask;
|
|
||||||
uint128_struct float_registers[8];
|
|
||||||
uint128_struct xmm_registers[16];
|
|
||||||
uint8_t reserved4[96];
|
|
||||||
} MDXmmSaveArea32AMD64; /* XMM_SAVE_AREA32 */
|
|
||||||
|
|
||||||
#define MD_CONTEXT_AMD64_VR_COUNT 26
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/*
|
|
||||||
* Register parameter home addresses.
|
|
||||||
*/
|
|
||||||
uint64_t p1_home;
|
|
||||||
uint64_t p2_home;
|
|
||||||
uint64_t p3_home;
|
|
||||||
uint64_t p4_home;
|
|
||||||
uint64_t p5_home;
|
|
||||||
uint64_t p6_home;
|
|
||||||
|
|
||||||
/* The next field determines the layout of the structure, and which parts
|
|
||||||
* of it are populated */
|
|
||||||
uint32_t context_flags;
|
|
||||||
uint32_t mx_csr;
|
|
||||||
|
|
||||||
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
|
|
||||||
uint16_t cs;
|
|
||||||
|
|
||||||
/* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */
|
|
||||||
uint16_t ds;
|
|
||||||
uint16_t es;
|
|
||||||
uint16_t fs;
|
|
||||||
uint16_t gs;
|
|
||||||
|
|
||||||
/* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */
|
|
||||||
uint16_t ss;
|
|
||||||
uint32_t eflags;
|
|
||||||
|
|
||||||
/* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */
|
|
||||||
uint64_t dr0;
|
|
||||||
uint64_t dr1;
|
|
||||||
uint64_t dr2;
|
|
||||||
uint64_t dr3;
|
|
||||||
uint64_t dr6;
|
|
||||||
uint64_t dr7;
|
|
||||||
|
|
||||||
/* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */
|
|
||||||
uint64_t rax;
|
|
||||||
uint64_t rcx;
|
|
||||||
uint64_t rdx;
|
|
||||||
uint64_t rbx;
|
|
||||||
|
|
||||||
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
|
|
||||||
uint64_t rsp;
|
|
||||||
|
|
||||||
/* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */
|
|
||||||
uint64_t rbp;
|
|
||||||
uint64_t rsi;
|
|
||||||
uint64_t rdi;
|
|
||||||
uint64_t r8;
|
|
||||||
uint64_t r9;
|
|
||||||
uint64_t r10;
|
|
||||||
uint64_t r11;
|
|
||||||
uint64_t r12;
|
|
||||||
uint64_t r13;
|
|
||||||
uint64_t r14;
|
|
||||||
uint64_t r15;
|
|
||||||
|
|
||||||
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
|
|
||||||
uint64_t rip;
|
|
||||||
|
|
||||||
/* The next set of registers are included with
|
|
||||||
* MD_CONTEXT_AMD64_FLOATING_POINT
|
|
||||||
*/
|
|
||||||
union {
|
|
||||||
MDXmmSaveArea32AMD64 flt_save;
|
|
||||||
struct {
|
|
||||||
uint128_struct header[2];
|
|
||||||
uint128_struct legacy[8];
|
|
||||||
uint128_struct xmm0;
|
|
||||||
uint128_struct xmm1;
|
|
||||||
uint128_struct xmm2;
|
|
||||||
uint128_struct xmm3;
|
|
||||||
uint128_struct xmm4;
|
|
||||||
uint128_struct xmm5;
|
|
||||||
uint128_struct xmm6;
|
|
||||||
uint128_struct xmm7;
|
|
||||||
uint128_struct xmm8;
|
|
||||||
uint128_struct xmm9;
|
|
||||||
uint128_struct xmm10;
|
|
||||||
uint128_struct xmm11;
|
|
||||||
uint128_struct xmm12;
|
|
||||||
uint128_struct xmm13;
|
|
||||||
uint128_struct xmm14;
|
|
||||||
uint128_struct xmm15;
|
|
||||||
} sse_registers;
|
|
||||||
};
|
|
||||||
|
|
||||||
uint128_struct vector_register[MD_CONTEXT_AMD64_VR_COUNT];
|
|
||||||
uint64_t vector_control;
|
|
||||||
|
|
||||||
/* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */
|
|
||||||
uint64_t debug_control;
|
|
||||||
uint64_t last_branch_to_rip;
|
|
||||||
uint64_t last_branch_from_rip;
|
|
||||||
uint64_t last_exception_to_rip;
|
|
||||||
uint64_t last_exception_from_rip;
|
|
||||||
|
|
||||||
} MDRawContextAMD64; /* CONTEXT */
|
|
||||||
|
|
||||||
/* For (MDRawContextAMD64).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. The high 24 bits identify the CPU, the
|
|
||||||
* low 8 bits identify the type of context saved. */
|
|
||||||
#define MD_CONTEXT_AMD64 0x00100000 /* CONTEXT_AMD64 */
|
|
||||||
#define MD_CONTEXT_AMD64_CONTROL (MD_CONTEXT_AMD64 | 0x00000001)
|
|
||||||
/* CONTEXT_CONTROL */
|
|
||||||
#define MD_CONTEXT_AMD64_INTEGER (MD_CONTEXT_AMD64 | 0x00000002)
|
|
||||||
/* CONTEXT_INTEGER */
|
|
||||||
#define MD_CONTEXT_AMD64_SEGMENTS (MD_CONTEXT_AMD64 | 0x00000004)
|
|
||||||
/* CONTEXT_SEGMENTS */
|
|
||||||
#define MD_CONTEXT_AMD64_FLOATING_POINT (MD_CONTEXT_AMD64 | 0x00000008)
|
|
||||||
/* CONTEXT_FLOATING_POINT */
|
|
||||||
#define MD_CONTEXT_AMD64_DEBUG_REGISTERS (MD_CONTEXT_AMD64 | 0x00000010)
|
|
||||||
/* CONTEXT_DEBUG_REGISTERS */
|
|
||||||
#define MD_CONTEXT_AMD64_XSTATE (MD_CONTEXT_AMD64 | 0x00000040)
|
|
||||||
/* CONTEXT_XSTATE */
|
|
||||||
|
|
||||||
/* WinNT.h refers to CONTEXT_MMX_REGISTERS but doesn't appear to define it
|
|
||||||
* I think it really means CONTEXT_FLOATING_POINT.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MD_CONTEXT_AMD64_FULL (MD_CONTEXT_AMD64_CONTROL | \
|
|
||||||
MD_CONTEXT_AMD64_INTEGER | \
|
|
||||||
MD_CONTEXT_AMD64_FLOATING_POINT)
|
|
||||||
/* CONTEXT_FULL */
|
|
||||||
|
|
||||||
#define MD_CONTEXT_AMD64_ALL (MD_CONTEXT_AMD64_FULL | \
|
|
||||||
MD_CONTEXT_AMD64_SEGMENTS | \
|
|
||||||
MD_CONTEXT_X86_DEBUG_REGISTERS)
|
|
||||||
/* CONTEXT_ALL */
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ */
|
|
||||||
|
|
@ -1,151 +0,0 @@
|
||||||
/* Copyright (c) 2009, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on ARM. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by
|
|
||||||
* ensuring that all members are aligned on their natural boundaries.
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file.
|
|
||||||
*
|
|
||||||
* Author: Julian Seward
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ARM support
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__
|
|
||||||
|
|
||||||
#define MD_FLOATINGSAVEAREA_ARM_FPR_COUNT 32
|
|
||||||
#define MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT 8
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note that these structures *do not* map directly to the CONTEXT
|
|
||||||
* structure defined in WinNT.h in the Windows Mobile SDK. That structure
|
|
||||||
* does not accomodate VFPv3, and I'm unsure if it was ever used in the
|
|
||||||
* wild anyway, as Windows CE only seems to produce "cedumps" which
|
|
||||||
* are not exactly minidumps.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint64_t fpscr; /* FPU status register */
|
|
||||||
|
|
||||||
/* 32 64-bit floating point registers, d0 .. d31. */
|
|
||||||
uint64_t regs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT];
|
|
||||||
|
|
||||||
/* Miscellaneous control words */
|
|
||||||
uint32_t extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT];
|
|
||||||
} MDFloatingSaveAreaARM;
|
|
||||||
|
|
||||||
#define MD_CONTEXT_ARM_GPR_COUNT 16
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* The next field determines the layout of the structure, and which parts
|
|
||||||
* of it are populated
|
|
||||||
*/
|
|
||||||
uint32_t context_flags;
|
|
||||||
|
|
||||||
/* 16 32-bit integer registers, r0 .. r15
|
|
||||||
* Note the following fixed uses:
|
|
||||||
* r13 is the stack pointer
|
|
||||||
* r14 is the link register
|
|
||||||
* r15 is the program counter
|
|
||||||
*/
|
|
||||||
uint32_t iregs[MD_CONTEXT_ARM_GPR_COUNT];
|
|
||||||
|
|
||||||
/* CPSR (flags, basically): 32 bits:
|
|
||||||
bit 31 - N (negative)
|
|
||||||
bit 30 - Z (zero)
|
|
||||||
bit 29 - C (carry)
|
|
||||||
bit 28 - V (overflow)
|
|
||||||
bit 27 - Q (saturation flag, sticky)
|
|
||||||
All other fields -- ignore */
|
|
||||||
uint32_t cpsr;
|
|
||||||
|
|
||||||
/* The next field is included with MD_CONTEXT_ARM_FLOATING_POINT */
|
|
||||||
MDFloatingSaveAreaARM float_save;
|
|
||||||
|
|
||||||
} MDRawContextARM;
|
|
||||||
|
|
||||||
/* Indices into iregs for registers with a dedicated or conventional
|
|
||||||
* purpose.
|
|
||||||
*/
|
|
||||||
enum MDARMRegisterNumbers {
|
|
||||||
MD_CONTEXT_ARM_REG_IOS_FP = 7,
|
|
||||||
MD_CONTEXT_ARM_REG_FP = 11,
|
|
||||||
MD_CONTEXT_ARM_REG_SP = 13,
|
|
||||||
MD_CONTEXT_ARM_REG_LR = 14,
|
|
||||||
MD_CONTEXT_ARM_REG_PC = 15
|
|
||||||
};
|
|
||||||
|
|
||||||
/* For (MDRawContextARM).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. */
|
|
||||||
/* CONTEXT_ARM from the Windows CE 5.0 SDK. This value isn't correct
|
|
||||||
* because this bit can be used for flags. Presumably this value was
|
|
||||||
* never actually used in minidumps, but only in "CEDumps" which
|
|
||||||
* are a whole parallel minidump file format for Windows CE.
|
|
||||||
* Therefore, Breakpad defines its own value for ARM CPUs.
|
|
||||||
*/
|
|
||||||
#define MD_CONTEXT_ARM_OLD 0x00000040
|
|
||||||
/* This value was chosen to avoid likely conflicts with MD_CONTEXT_*
|
|
||||||
* for other CPUs. */
|
|
||||||
#define MD_CONTEXT_ARM 0x40000000
|
|
||||||
#define MD_CONTEXT_ARM_INTEGER (MD_CONTEXT_ARM | 0x00000002)
|
|
||||||
#define MD_CONTEXT_ARM_FLOATING_POINT (MD_CONTEXT_ARM | 0x00000004)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_ARM_FULL (MD_CONTEXT_ARM_INTEGER | \
|
|
||||||
MD_CONTEXT_ARM_FLOATING_POINT)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_ARM_ALL (MD_CONTEXT_ARM_INTEGER | \
|
|
||||||
MD_CONTEXT_ARM_FLOATING_POINT)
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ */
|
|
||||||
|
|
@ -1,192 +0,0 @@
|
||||||
/* Copyright 2013 Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on ARM. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by
|
|
||||||
* ensuring that all members are aligned on their natural boundaries.
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file.
|
|
||||||
*
|
|
||||||
* Author: Colin Blundell
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ARM64 support
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__
|
|
||||||
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
#define MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT 32
|
|
||||||
#define MD_CONTEXT_ARM64_GPR_COUNT 33
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* 32 128-bit floating point registers, d0 .. d31. */
|
|
||||||
uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT];
|
|
||||||
|
|
||||||
uint32_t fpcr; /* FPU control register */
|
|
||||||
uint32_t fpsr; /* FPU status register */
|
|
||||||
} MDFloatingSaveAreaARM64;
|
|
||||||
|
|
||||||
/* For (MDRawContextARM64).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. */
|
|
||||||
#define MD_CONTEXT_ARM64 0x00400000
|
|
||||||
#define MD_CONTEXT_ARM64_CONTROL (MD_CONTEXT_ARM64 | 0x00000001)
|
|
||||||
#define MD_CONTEXT_ARM64_INTEGER (MD_CONTEXT_ARM64 | 0x00000002)
|
|
||||||
#define MD_CONTEXT_ARM64_FLOATING_POINT (MD_CONTEXT_ARM64 | 0x00000004)
|
|
||||||
#define MD_CONTEXT_ARM64_DEBUG (MD_CONTEXT_ARM64 | 0x00000008)
|
|
||||||
#define MD_CONTEXT_ARM64_FULL (MD_CONTEXT_ARM64_CONTROL | \
|
|
||||||
MD_CONTEXT_ARM64_INTEGER | \
|
|
||||||
MD_CONTEXT_ARM64_FLOATING_POINT)
|
|
||||||
#define MD_CONTEXT_ARM64_ALL (MD_CONTEXT_ARM64_FULL | MD_CONTEXT_ARM64_DEBUG)
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* Determines which fields of this struct are populated */
|
|
||||||
uint32_t context_flags;
|
|
||||||
|
|
||||||
/* CPSR (flags, basically): 32 bits:
|
|
||||||
bit 31 - N (negative)
|
|
||||||
bit 30 - Z (zero)
|
|
||||||
bit 29 - C (carry)
|
|
||||||
bit 28 - V (overflow)
|
|
||||||
bit 27 - Q (saturation flag, sticky)
|
|
||||||
All other fields -- ignore */
|
|
||||||
uint32_t cpsr;
|
|
||||||
|
|
||||||
/* 33 64-bit integer registers, x0 .. x31 + the PC
|
|
||||||
* Note the following fixed uses:
|
|
||||||
* x29 is the frame pointer
|
|
||||||
* x30 is the link register
|
|
||||||
* x31 is the stack pointer
|
|
||||||
* The PC is effectively x32.
|
|
||||||
*/
|
|
||||||
uint64_t iregs[MD_CONTEXT_ARM64_GPR_COUNT];
|
|
||||||
|
|
||||||
/* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */
|
|
||||||
MDFloatingSaveAreaARM64 float_save;
|
|
||||||
|
|
||||||
uint32_t bcr[8];
|
|
||||||
uint64_t bvr[8];
|
|
||||||
uint32_t wcr[2];
|
|
||||||
uint64_t wvr[2];
|
|
||||||
} MDRawContextARM64;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t fpsr; /* FPU status register */
|
|
||||||
uint32_t fpcr; /* FPU control register */
|
|
||||||
|
|
||||||
/* 32 128-bit floating point registers, d0 .. d31. */
|
|
||||||
uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT];
|
|
||||||
} MDFloatingSaveAreaARM64_Old;
|
|
||||||
|
|
||||||
/* Use the same 32-bit alignment when accessing this structure from 64-bit code
|
|
||||||
* as is used natively in 32-bit code. */
|
|
||||||
#pragma pack(push, 4)
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* The next field determines the layout of the structure, and which parts
|
|
||||||
* of it are populated
|
|
||||||
*/
|
|
||||||
uint64_t context_flags;
|
|
||||||
|
|
||||||
/* 33 64-bit integer registers, x0 .. x31 + the PC
|
|
||||||
* Note the following fixed uses:
|
|
||||||
* x29 is the frame pointer
|
|
||||||
* x30 is the link register
|
|
||||||
* x31 is the stack pointer
|
|
||||||
* The PC is effectively x32.
|
|
||||||
*/
|
|
||||||
uint64_t iregs[MD_CONTEXT_ARM64_GPR_COUNT];
|
|
||||||
|
|
||||||
/* CPSR (flags, basically): 32 bits:
|
|
||||||
bit 31 - N (negative)
|
|
||||||
bit 30 - Z (zero)
|
|
||||||
bit 29 - C (carry)
|
|
||||||
bit 28 - V (overflow)
|
|
||||||
bit 27 - Q (saturation flag, sticky)
|
|
||||||
All other fields -- ignore */
|
|
||||||
uint32_t cpsr;
|
|
||||||
|
|
||||||
/* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */
|
|
||||||
MDFloatingSaveAreaARM64_Old float_save;
|
|
||||||
|
|
||||||
} MDRawContextARM64_Old;
|
|
||||||
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
/* Indices into iregs for registers with a dedicated or conventional
|
|
||||||
* purpose.
|
|
||||||
*/
|
|
||||||
enum MDARM64RegisterNumbers {
|
|
||||||
MD_CONTEXT_ARM64_REG_FP = 29,
|
|
||||||
MD_CONTEXT_ARM64_REG_LR = 30,
|
|
||||||
MD_CONTEXT_ARM64_REG_SP = 31,
|
|
||||||
MD_CONTEXT_ARM64_REG_PC = 32
|
|
||||||
};
|
|
||||||
|
|
||||||
/* For (MDRawContextARM64_Old).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. MD_CONTEXT_ARM64_OLD is Breakpad-defined.
|
|
||||||
* This value was chosen to avoid likely conflicts with MD_CONTEXT_*
|
|
||||||
* for other CPUs. */
|
|
||||||
#define MD_CONTEXT_ARM64_OLD 0x80000000
|
|
||||||
#define MD_CONTEXT_ARM64_INTEGER_OLD (MD_CONTEXT_ARM64_OLD | 0x00000002)
|
|
||||||
#define MD_CONTEXT_ARM64_FLOATING_POINT_OLD (MD_CONTEXT_ARM64_OLD | 0x00000004)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_ARM64_FULL_OLD (MD_CONTEXT_ARM64_INTEGER_OLD | \
|
|
||||||
MD_CONTEXT_ARM64_FLOATING_POINT_OLD)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_ARM64_ALL_OLD (MD_CONTEXT_ARM64_INTEGER_OLD | \
|
|
||||||
MD_CONTEXT_ARM64_FLOATING_POINT_OLD)
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ */
|
|
||||||
|
|
@ -1,176 +0,0 @@
|
||||||
/* Copyright (c) 2013, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on MIPS. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by
|
|
||||||
* ensuring that all members are aligned on their natural boundaries.
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file.
|
|
||||||
*
|
|
||||||
* Author: Chris Dearman
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MIPS support
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
|
|
||||||
|
|
||||||
#define MD_CONTEXT_MIPS_GPR_COUNT 32
|
|
||||||
#define MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT 32
|
|
||||||
#define MD_CONTEXT_MIPS_DSP_COUNT 3
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note that these structures *do not* map directly to the CONTEXT
|
|
||||||
* structure defined in WinNT.h in the Windows Mobile SDK. That structure
|
|
||||||
* does not accomodate VFPv3, and I'm unsure if it was ever used in the
|
|
||||||
* wild anyway, as Windows CE only seems to produce "cedumps" which
|
|
||||||
* are not exactly minidumps.
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
/* 32 64-bit floating point registers, f0..f31 */
|
|
||||||
uint64_t regs[MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT];
|
|
||||||
|
|
||||||
uint32_t fpcsr; /* FPU status register. */
|
|
||||||
uint32_t fir; /* FPU implementation register. */
|
|
||||||
} MDFloatingSaveAreaMIPS;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* The next field determines the layout of the structure, and which parts
|
|
||||||
* of it are populated.
|
|
||||||
*/
|
|
||||||
uint32_t context_flags;
|
|
||||||
uint32_t _pad0;
|
|
||||||
|
|
||||||
/* 32 64-bit integer registers, r0..r31.
|
|
||||||
* Note the following fixed uses:
|
|
||||||
* r29 is the stack pointer.
|
|
||||||
* r31 is the return address.
|
|
||||||
*/
|
|
||||||
uint64_t iregs[MD_CONTEXT_MIPS_GPR_COUNT];
|
|
||||||
|
|
||||||
/* multiply/divide result. */
|
|
||||||
uint64_t mdhi, mdlo;
|
|
||||||
|
|
||||||
/* DSP accumulators. */
|
|
||||||
uint32_t hi[MD_CONTEXT_MIPS_DSP_COUNT];
|
|
||||||
uint32_t lo[MD_CONTEXT_MIPS_DSP_COUNT];
|
|
||||||
uint32_t dsp_control;
|
|
||||||
uint32_t _pad1;
|
|
||||||
|
|
||||||
uint64_t epc;
|
|
||||||
uint64_t badvaddr;
|
|
||||||
uint32_t status;
|
|
||||||
uint32_t cause;
|
|
||||||
|
|
||||||
/* The next field is included with MD_CONTEXT_MIPS_FLOATING_POINT. */
|
|
||||||
MDFloatingSaveAreaMIPS float_save;
|
|
||||||
|
|
||||||
} MDRawContextMIPS;
|
|
||||||
|
|
||||||
/* Indices into iregs for registers with a dedicated or conventional
|
|
||||||
* purpose.
|
|
||||||
*/
|
|
||||||
enum MDMIPSRegisterNumbers {
|
|
||||||
MD_CONTEXT_MIPS_REG_S0 = 16,
|
|
||||||
MD_CONTEXT_MIPS_REG_S1 = 17,
|
|
||||||
MD_CONTEXT_MIPS_REG_S2 = 18,
|
|
||||||
MD_CONTEXT_MIPS_REG_S3 = 19,
|
|
||||||
MD_CONTEXT_MIPS_REG_S4 = 20,
|
|
||||||
MD_CONTEXT_MIPS_REG_S5 = 21,
|
|
||||||
MD_CONTEXT_MIPS_REG_S6 = 22,
|
|
||||||
MD_CONTEXT_MIPS_REG_S7 = 23,
|
|
||||||
MD_CONTEXT_MIPS_REG_GP = 28,
|
|
||||||
MD_CONTEXT_MIPS_REG_SP = 29,
|
|
||||||
MD_CONTEXT_MIPS_REG_FP = 30,
|
|
||||||
MD_CONTEXT_MIPS_REG_RA = 31,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* For (MDRawContextMIPS).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. */
|
|
||||||
/* CONTEXT_MIPS from the Windows CE 5.0 SDK. This value isn't correct
|
|
||||||
* because this bit can be used for flags. Presumably this value was
|
|
||||||
* never actually used in minidumps, but only in "CEDumps" which
|
|
||||||
* are a whole parallel minidump file format for Windows CE.
|
|
||||||
* Therefore, Breakpad defines its own value for MIPS CPUs.
|
|
||||||
*/
|
|
||||||
#define MD_CONTEXT_MIPS 0x00040000
|
|
||||||
#define MD_CONTEXT_MIPS_INTEGER (MD_CONTEXT_MIPS | 0x00000002)
|
|
||||||
#define MD_CONTEXT_MIPS_FLOATING_POINT (MD_CONTEXT_MIPS | 0x00000004)
|
|
||||||
#define MD_CONTEXT_MIPS_DSP (MD_CONTEXT_MIPS | 0x00000008)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_MIPS_FULL (MD_CONTEXT_MIPS_INTEGER | \
|
|
||||||
MD_CONTEXT_MIPS_FLOATING_POINT | \
|
|
||||||
MD_CONTEXT_MIPS_DSP)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_MIPS_ALL (MD_CONTEXT_MIPS_INTEGER | \
|
|
||||||
MD_CONTEXT_MIPS_FLOATING_POINT \
|
|
||||||
MD_CONTEXT_MIPS_DSP)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Breakpad defines for MIPS64
|
|
||||||
*/
|
|
||||||
#define MD_CONTEXT_MIPS64 0x00080000
|
|
||||||
#define MD_CONTEXT_MIPS64_INTEGER (MD_CONTEXT_MIPS64 | 0x00000002)
|
|
||||||
#define MD_CONTEXT_MIPS64_FLOATING_POINT (MD_CONTEXT_MIPS64 | 0x00000004)
|
|
||||||
#define MD_CONTEXT_MIPS64_DSP (MD_CONTEXT_MIPS64 | 0x00000008)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_MIPS64_FULL (MD_CONTEXT_MIPS64_INTEGER | \
|
|
||||||
MD_CONTEXT_MIPS64_FLOATING_POINT | \
|
|
||||||
MD_CONTEXT_MIPS64_DSP)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_MIPS64_ALL (MD_CONTEXT_MIPS64_INTEGER | \
|
|
||||||
MD_CONTEXT_MIPS64_FLOATING_POINT \
|
|
||||||
MD_CONTEXT_MIPS64_DSP)
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
|
|
||||||
|
|
@ -1,168 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on ppc. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by ensuring
|
|
||||||
* ensuring that all members are aligned on their natural boundaries. In
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* These definitions may be extended to support handling minidump files
|
|
||||||
* for other CPUs and other operating systems.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably in terms of interoperability with minidumps
|
|
||||||
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file. DbgHelp
|
|
||||||
* on Windows is assumed to be the reference implementation; this file
|
|
||||||
* seeks to provide a cross-platform compatible implementation. To avoid
|
|
||||||
* collisions with the types and values defined and used by DbgHelp in the
|
|
||||||
* event that this implementation is used on Windows, each type and value
|
|
||||||
* defined here is given a new name, beginning with "MD". Names of the
|
|
||||||
* equivalent types and values in the Windows Platform SDK are given in
|
|
||||||
* comments.
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai
|
|
||||||
* Change to split into its own file: Neal Sidhwaney */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Breakpad minidump extension for PowerPC support. Based on Darwin/Mac OS X'
|
|
||||||
* mach/ppc/_types.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__
|
|
||||||
|
|
||||||
#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* fpregs is a double[32] in mach/ppc/_types.h, but a uint64_t is used
|
|
||||||
* here for precise sizing. */
|
|
||||||
uint64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT];
|
|
||||||
uint32_t fpscr_pad;
|
|
||||||
uint32_t fpscr; /* Status/control */
|
|
||||||
} MDFloatingSaveAreaPPC; /* Based on ppc_float_state */
|
|
||||||
|
|
||||||
|
|
||||||
#define MD_VECTORSAVEAREA_PPC_VR_COUNT 32
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h
|
|
||||||
* exposes them as four 32-bit quantities. */
|
|
||||||
uint128_struct save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT];
|
|
||||||
uint128_struct save_vscr; /* Status/control */
|
|
||||||
uint32_t save_pad5[4];
|
|
||||||
uint32_t save_vrvalid; /* Indicates which vector registers are saved */
|
|
||||||
uint32_t save_pad6[7];
|
|
||||||
} MDVectorSaveAreaPPC; /* ppc_vector_state */
|
|
||||||
|
|
||||||
|
|
||||||
#define MD_CONTEXT_PPC_GPR_COUNT 32
|
|
||||||
|
|
||||||
/* Use the same 32-bit alignment when accessing this structure from 64-bit code
|
|
||||||
* as is used natively in 32-bit code. #pragma pack is a MSVC extension
|
|
||||||
* supported by gcc. */
|
|
||||||
#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
|
||||||
#pragma pack(4)
|
|
||||||
#else
|
|
||||||
#pragma pack(push, 4)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* context_flags is not present in ppc_thread_state, but it aids
|
|
||||||
* identification of MDRawContextPPC among other raw context types,
|
|
||||||
* and it guarantees alignment when we get to float_save. */
|
|
||||||
uint32_t context_flags;
|
|
||||||
|
|
||||||
uint32_t srr0; /* Machine status save/restore: stores pc
|
|
||||||
* (instruction) */
|
|
||||||
uint32_t srr1; /* Machine status save/restore: stores msr
|
|
||||||
* (ps, program/machine state) */
|
|
||||||
/* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is
|
|
||||||
* used for brevity. */
|
|
||||||
uint32_t gpr[MD_CONTEXT_PPC_GPR_COUNT];
|
|
||||||
uint32_t cr; /* Condition */
|
|
||||||
uint32_t xer; /* Integer (fiXed-point) exception */
|
|
||||||
uint32_t lr; /* Link */
|
|
||||||
uint32_t ctr; /* Count */
|
|
||||||
uint32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */
|
|
||||||
uint32_t vrsave; /* Vector save */
|
|
||||||
|
|
||||||
/* float_save and vector_save aren't present in ppc_thread_state, but
|
|
||||||
* are represented in separate structures that still define a thread's
|
|
||||||
* context. */
|
|
||||||
MDFloatingSaveAreaPPC float_save;
|
|
||||||
MDVectorSaveAreaPPC vector_save;
|
|
||||||
} MDRawContextPPC; /* Based on ppc_thread_state */
|
|
||||||
|
|
||||||
/* Indices into gpr for registers with a dedicated or conventional purpose. */
|
|
||||||
enum MDPPCRegisterNumbers {
|
|
||||||
MD_CONTEXT_PPC_REG_SP = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
|
||||||
#pragma pack(0)
|
|
||||||
#else
|
|
||||||
#pragma pack(pop)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* For (MDRawContextPPC).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its
|
|
||||||
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
|
|
||||||
* CPUs. */
|
|
||||||
#define MD_CONTEXT_PPC 0x20000000
|
|
||||||
#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001)
|
|
||||||
#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008)
|
|
||||||
#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE
|
|
||||||
#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \
|
|
||||||
MD_CONTEXT_PPC_FLOATING_POINT | \
|
|
||||||
MD_CONTEXT_PPC_VECTOR)
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ */
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
||||||
/* Copyright (c) 2008, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on ppc64. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by ensuring
|
|
||||||
* ensuring that all members are aligned on their natural boundaries. In
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* These definitions may be extended to support handling minidump files
|
|
||||||
* for other CPUs and other operating systems.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably in terms of interoperability with minidumps
|
|
||||||
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file. DbgHelp
|
|
||||||
* on Windows is assumed to be the reference implementation; this file
|
|
||||||
* seeks to provide a cross-platform compatible implementation. To avoid
|
|
||||||
* collisions with the types and values defined and used by DbgHelp in the
|
|
||||||
* event that this implementation is used on Windows, each type and value
|
|
||||||
* defined here is given a new name, beginning with "MD". Names of the
|
|
||||||
* equivalent types and values in the Windows Platform SDK are given in
|
|
||||||
* comments.
|
|
||||||
*
|
|
||||||
* Author: Neal Sidhwaney */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Breakpad minidump extension for PPC64 support. Based on Darwin/Mac OS X'
|
|
||||||
* mach/ppc/_types.h
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__
|
|
||||||
|
|
||||||
#include "minidump_cpu_ppc.h"
|
|
||||||
|
|
||||||
// these types are the same in ppc64 & ppc
|
|
||||||
typedef MDFloatingSaveAreaPPC MDFloatingSaveAreaPPC64;
|
|
||||||
typedef MDVectorSaveAreaPPC MDVectorSaveAreaPPC64;
|
|
||||||
|
|
||||||
#define MD_CONTEXT_PPC64_GPR_COUNT MD_CONTEXT_PPC_GPR_COUNT
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* context_flags is not present in ppc_thread_state, but it aids
|
|
||||||
* identification of MDRawContextPPC among other raw context types,
|
|
||||||
* and it guarantees alignment when we get to float_save. */
|
|
||||||
uint64_t context_flags;
|
|
||||||
|
|
||||||
uint64_t srr0; /* Machine status save/restore: stores pc
|
|
||||||
* (instruction) */
|
|
||||||
uint64_t srr1; /* Machine status save/restore: stores msr
|
|
||||||
* (ps, program/machine state) */
|
|
||||||
/* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is
|
|
||||||
* used for brevity. */
|
|
||||||
uint64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT];
|
|
||||||
uint64_t cr; /* Condition */
|
|
||||||
uint64_t xer; /* Integer (fiXed-point) exception */
|
|
||||||
uint64_t lr; /* Link */
|
|
||||||
uint64_t ctr; /* Count */
|
|
||||||
uint64_t vrsave; /* Vector save */
|
|
||||||
|
|
||||||
/* float_save and vector_save aren't present in ppc_thread_state, but
|
|
||||||
* are represented in separate structures that still define a thread's
|
|
||||||
* context. */
|
|
||||||
MDFloatingSaveAreaPPC float_save;
|
|
||||||
MDVectorSaveAreaPPC vector_save;
|
|
||||||
} MDRawContextPPC64; /* Based on ppc_thread_state */
|
|
||||||
|
|
||||||
/* Indices into gpr for registers with a dedicated or conventional purpose. */
|
|
||||||
enum MDPPC64RegisterNumbers {
|
|
||||||
MD_CONTEXT_PPC64_REG_SP = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
/* For (MDRawContextPPC).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its
|
|
||||||
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
|
|
||||||
* CPUs. */
|
|
||||||
#define MD_CONTEXT_PPC64 0x01000000
|
|
||||||
#define MD_CONTEXT_PPC64_BASE (MD_CONTEXT_PPC64 | 0x00000001)
|
|
||||||
#define MD_CONTEXT_PPC64_FLOATING_POINT (MD_CONTEXT_PPC64 | 0x00000008)
|
|
||||||
#define MD_CONTEXT_PPC64_VECTOR (MD_CONTEXT_PPC64 | 0x00000020)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_PPC64_FULL MD_CONTEXT_PPC64_BASE
|
|
||||||
#define MD_CONTEXT_PPC64_ALL (MD_CONTEXT_PPC64_FULL | \
|
|
||||||
MD_CONTEXT_PPC64_FLOATING_POINT | \
|
|
||||||
MD_CONTEXT_PPC64_VECTOR)
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */
|
|
||||||
|
|
@ -1,163 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on sparc. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by ensuring
|
|
||||||
* ensuring that all members are aligned on their natural boundaries. In
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* These definitions may be extended to support handling minidump files
|
|
||||||
* for other CPUs and other operating systems.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably in terms of interoperability with minidumps
|
|
||||||
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file. DbgHelp
|
|
||||||
* on Windows is assumed to be the reference implementation; this file
|
|
||||||
* seeks to provide a cross-platform compatible implementation. To avoid
|
|
||||||
* collisions with the types and values defined and used by DbgHelp in the
|
|
||||||
* event that this implementation is used on Windows, each type and value
|
|
||||||
* defined here is given a new name, beginning with "MD". Names of the
|
|
||||||
* equivalent types and values in the Windows Platform SDK are given in
|
|
||||||
* comments.
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai
|
|
||||||
* Change to split into its own file: Neal Sidhwaney */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SPARC support, see (solaris)sys/procfs_isa.h also
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__
|
|
||||||
|
|
||||||
#define MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT 32
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
|
|
||||||
/* FPU floating point regs */
|
|
||||||
uint64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT];
|
|
||||||
|
|
||||||
uint64_t filler;
|
|
||||||
uint64_t fsr; /* FPU status register */
|
|
||||||
} MDFloatingSaveAreaSPARC; /* FLOATING_SAVE_AREA */
|
|
||||||
|
|
||||||
#define MD_CONTEXT_SPARC_GPR_COUNT 32
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* The next field determines the layout of the structure, and which parts
|
|
||||||
* of it are populated
|
|
||||||
*/
|
|
||||||
uint32_t context_flags;
|
|
||||||
uint32_t flag_pad;
|
|
||||||
/*
|
|
||||||
* General register access (SPARC).
|
|
||||||
* Don't confuse definitions here with definitions in <sys/regset.h>.
|
|
||||||
* Registers are 32 bits for ILP32, 64 bits for LP64.
|
|
||||||
* SPARC V7/V8 is for 32bit, SPARC V9 is for 64bit
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* 32 Integer working registers */
|
|
||||||
|
|
||||||
/* g_r[0-7] global registers(g0-g7)
|
|
||||||
* g_r[8-15] out registers(o0-o7)
|
|
||||||
* g_r[16-23] local registers(l0-l7)
|
|
||||||
* g_r[24-31] in registers(i0-i7)
|
|
||||||
*/
|
|
||||||
uint64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT];
|
|
||||||
|
|
||||||
/* several control registers */
|
|
||||||
|
|
||||||
/* Processor State register(PSR) for SPARC V7/V8
|
|
||||||
* Condition Code register (CCR) for SPARC V9
|
|
||||||
*/
|
|
||||||
uint64_t ccr;
|
|
||||||
|
|
||||||
uint64_t pc; /* Program Counter register (PC) */
|
|
||||||
uint64_t npc; /* Next Program Counter register (nPC) */
|
|
||||||
uint64_t y; /* Y register (Y) */
|
|
||||||
|
|
||||||
/* Address Space Identifier register (ASI) for SPARC V9
|
|
||||||
* WIM for SPARC V7/V8
|
|
||||||
*/
|
|
||||||
uint64_t asi;
|
|
||||||
|
|
||||||
/* Floating-Point Registers State register (FPRS) for SPARC V9
|
|
||||||
* TBR for for SPARC V7/V8
|
|
||||||
*/
|
|
||||||
uint64_t fprs;
|
|
||||||
|
|
||||||
/* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */
|
|
||||||
MDFloatingSaveAreaSPARC float_save;
|
|
||||||
|
|
||||||
} MDRawContextSPARC; /* CONTEXT_SPARC */
|
|
||||||
|
|
||||||
/* Indices into g_r for registers with a dedicated or conventional purpose. */
|
|
||||||
enum MDSPARCRegisterNumbers {
|
|
||||||
MD_CONTEXT_SPARC_REG_SP = 14
|
|
||||||
};
|
|
||||||
|
|
||||||
/* For (MDRawContextSPARC).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. MD_CONTEXT_SPARC is Breakpad-defined. Its
|
|
||||||
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
|
|
||||||
* CPUs. */
|
|
||||||
#define MD_CONTEXT_SPARC 0x10000000
|
|
||||||
#define MD_CONTEXT_SPARC_CONTROL (MD_CONTEXT_SPARC | 0x00000001)
|
|
||||||
#define MD_CONTEXT_SPARC_INTEGER (MD_CONTEXT_SPARC | 0x00000002)
|
|
||||||
#define MD_CONTEXT_SAPARC_FLOATING_POINT (MD_CONTEXT_SPARC | 0x00000004)
|
|
||||||
#define MD_CONTEXT_SAPARC_EXTRA (MD_CONTEXT_SPARC | 0x00000008)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_SPARC_FULL (MD_CONTEXT_SPARC_CONTROL | \
|
|
||||||
MD_CONTEXT_SPARC_INTEGER)
|
|
||||||
|
|
||||||
#define MD_CONTEXT_SPARC_ALL (MD_CONTEXT_SPARC_FULL | \
|
|
||||||
MD_CONTEXT_SAPARC_FLOATING_POINT | \
|
|
||||||
MD_CONTEXT_SAPARC_EXTRA)
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ */
|
|
||||||
|
|
@ -1,174 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_format.h: A cross-platform reimplementation of minidump-related
|
|
||||||
* portions of DbgHelp.h from the Windows Platform SDK.
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* This file contains the necessary definitions to read minidump files
|
|
||||||
* produced on x86. These files may be read on any platform provided
|
|
||||||
* that the alignments of these structures on the processing system are
|
|
||||||
* identical to the alignments of these structures on the producing system.
|
|
||||||
* For this reason, precise-sized types are used. The structures defined
|
|
||||||
* by this file have been laid out to minimize alignment problems by ensuring
|
|
||||||
* ensuring that all members are aligned on their natural boundaries. In
|
|
||||||
* In some cases, tail-padding may be significant when different ABIs specify
|
|
||||||
* different tail-padding behaviors. To avoid problems when reading or
|
|
||||||
* writing affected structures, MD_*_SIZE macros are provided where needed,
|
|
||||||
* containing the useful size of the structures without padding.
|
|
||||||
*
|
|
||||||
* Structures that are defined by Microsoft to contain a zero-length array
|
|
||||||
* are instead defined here to contain an array with one element, as
|
|
||||||
* zero-length arrays are forbidden by standard C and C++. In these cases,
|
|
||||||
* *_minsize constants are provided to be used in place of sizeof. For a
|
|
||||||
* cleaner interface to these sizes when using C++, see minidump_size.h.
|
|
||||||
*
|
|
||||||
* These structures are also sufficient to populate minidump files.
|
|
||||||
*
|
|
||||||
* These definitions may be extended to support handling minidump files
|
|
||||||
* for other CPUs and other operating systems.
|
|
||||||
*
|
|
||||||
* Because precise data type sizes are crucial for this implementation to
|
|
||||||
* function properly and portably in terms of interoperability with minidumps
|
|
||||||
* produced by DbgHelp on Windows, a set of primitive types with known sizes
|
|
||||||
* are used as the basis of each structure defined by this file. DbgHelp
|
|
||||||
* on Windows is assumed to be the reference implementation; this file
|
|
||||||
* seeks to provide a cross-platform compatible implementation. To avoid
|
|
||||||
* collisions with the types and values defined and used by DbgHelp in the
|
|
||||||
* event that this implementation is used on Windows, each type and value
|
|
||||||
* defined here is given a new name, beginning with "MD". Names of the
|
|
||||||
* equivalent types and values in the Windows Platform SDK are given in
|
|
||||||
* comments.
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai */
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__
|
|
||||||
|
|
||||||
#define MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE 80
|
|
||||||
/* SIZE_OF_80387_REGISTERS */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t control_word;
|
|
||||||
uint32_t status_word;
|
|
||||||
uint32_t tag_word;
|
|
||||||
uint32_t error_offset;
|
|
||||||
uint32_t error_selector;
|
|
||||||
uint32_t data_offset;
|
|
||||||
uint32_t data_selector;
|
|
||||||
|
|
||||||
/* register_area contains eight 80-bit (x87 "long double") quantities for
|
|
||||||
* floating-point registers %st0 (%mm0) through %st7 (%mm7). */
|
|
||||||
uint8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE];
|
|
||||||
uint32_t cr0_npx_state;
|
|
||||||
} MDFloatingSaveAreaX86; /* FLOATING_SAVE_AREA */
|
|
||||||
|
|
||||||
|
|
||||||
#define MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE 512
|
|
||||||
/* MAXIMUM_SUPPORTED_EXTENSION */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
/* The next field determines the layout of the structure, and which parts
|
|
||||||
* of it are populated */
|
|
||||||
uint32_t context_flags;
|
|
||||||
|
|
||||||
/* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */
|
|
||||||
uint32_t dr0;
|
|
||||||
uint32_t dr1;
|
|
||||||
uint32_t dr2;
|
|
||||||
uint32_t dr3;
|
|
||||||
uint32_t dr6;
|
|
||||||
uint32_t dr7;
|
|
||||||
|
|
||||||
/* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */
|
|
||||||
MDFloatingSaveAreaX86 float_save;
|
|
||||||
|
|
||||||
/* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */
|
|
||||||
uint32_t gs;
|
|
||||||
uint32_t fs;
|
|
||||||
uint32_t es;
|
|
||||||
uint32_t ds;
|
|
||||||
/* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */
|
|
||||||
uint32_t edi;
|
|
||||||
uint32_t esi;
|
|
||||||
uint32_t ebx;
|
|
||||||
uint32_t edx;
|
|
||||||
uint32_t ecx;
|
|
||||||
uint32_t eax;
|
|
||||||
|
|
||||||
/* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */
|
|
||||||
uint32_t ebp;
|
|
||||||
uint32_t eip;
|
|
||||||
uint32_t cs; /* WinNT.h says "must be sanitized" */
|
|
||||||
uint32_t eflags; /* WinNT.h says "must be sanitized" */
|
|
||||||
uint32_t esp;
|
|
||||||
uint32_t ss;
|
|
||||||
|
|
||||||
/* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS.
|
|
||||||
* It contains vector (MMX/SSE) registers. It it laid out in the
|
|
||||||
* format used by the fxsave and fsrstor instructions, so it includes
|
|
||||||
* a copy of the x87 floating-point registers as well. See FXSAVE in
|
|
||||||
* "Intel Architecture Software Developer's Manual, Volume 2." */
|
|
||||||
uint8_t extended_registers[
|
|
||||||
MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE];
|
|
||||||
} MDRawContextX86; /* CONTEXT */
|
|
||||||
|
|
||||||
/* For (MDRawContextX86).context_flags. These values indicate the type of
|
|
||||||
* context stored in the structure. The high 24 bits identify the CPU, the
|
|
||||||
* low 8 bits identify the type of context saved. */
|
|
||||||
#define MD_CONTEXT_X86 0x00010000
|
|
||||||
/* CONTEXT_i386, CONTEXT_i486: identifies CPU */
|
|
||||||
#define MD_CONTEXT_X86_CONTROL (MD_CONTEXT_X86 | 0x00000001)
|
|
||||||
/* CONTEXT_CONTROL */
|
|
||||||
#define MD_CONTEXT_X86_INTEGER (MD_CONTEXT_X86 | 0x00000002)
|
|
||||||
/* CONTEXT_INTEGER */
|
|
||||||
#define MD_CONTEXT_X86_SEGMENTS (MD_CONTEXT_X86 | 0x00000004)
|
|
||||||
/* CONTEXT_SEGMENTS */
|
|
||||||
#define MD_CONTEXT_X86_FLOATING_POINT (MD_CONTEXT_X86 | 0x00000008)
|
|
||||||
/* CONTEXT_FLOATING_POINT */
|
|
||||||
#define MD_CONTEXT_X86_DEBUG_REGISTERS (MD_CONTEXT_X86 | 0x00000010)
|
|
||||||
/* CONTEXT_DEBUG_REGISTERS */
|
|
||||||
#define MD_CONTEXT_X86_EXTENDED_REGISTERS (MD_CONTEXT_X86 | 0x00000020)
|
|
||||||
/* CONTEXT_EXTENDED_REGISTERS */
|
|
||||||
#define MD_CONTEXT_X86_XSTATE (MD_CONTEXT_X86 | 0x00000040)
|
|
||||||
/* CONTEXT_XSTATE */
|
|
||||||
|
|
||||||
#define MD_CONTEXT_X86_FULL (MD_CONTEXT_X86_CONTROL | \
|
|
||||||
MD_CONTEXT_X86_INTEGER | \
|
|
||||||
MD_CONTEXT_X86_SEGMENTS)
|
|
||||||
/* CONTEXT_FULL */
|
|
||||||
|
|
||||||
#define MD_CONTEXT_X86_ALL (MD_CONTEXT_X86_FULL | \
|
|
||||||
MD_CONTEXT_X86_FLOATING_POINT | \
|
|
||||||
MD_CONTEXT_X86_DEBUG_REGISTERS | \
|
|
||||||
MD_CONTEXT_X86_EXTENDED_REGISTERS)
|
|
||||||
/* CONTEXT_ALL */
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ */
|
|
||||||
|
|
@ -1,125 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_exception_linux.h: A definition of exception codes for
|
|
||||||
* Linux
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai
|
|
||||||
* Split into its own file: Neal Sidhwaney */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* For (MDException).exception_code. These values come from bits/signum.h.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGHUP = 1, /* Hangup (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGINT = 2, /* Interrupt (ANSI) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGQUIT = 3, /* Quit (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGILL = 4, /* Illegal instruction (ANSI) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGTRAP = 5, /* Trace trap (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGABRT = 6, /* Abort (ANSI) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGBUS = 7, /* BUS error (4.2 BSD) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGFPE = 8, /* Floating-point exception (ANSI) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGKILL = 9, /* Kill, unblockable (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGUSR1 = 10, /* User-defined signal 1 (POSIX). */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGSEGV = 11, /* Segmentation violation (ANSI) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGUSR2 = 12, /* User-defined signal 2 (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGPIPE = 13, /* Broken pipe (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGALRM = 14, /* Alarm clock (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGTERM = 15, /* Termination (ANSI) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGSTKFLT = 16, /* Stack faultd */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGCHLD = 17, /* Child status has changed (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGCONT = 18, /* Continue (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGSTOP = 19, /* Stop, unblockable (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGTSTP = 20, /* Keyboard stop (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGTTIN = 21, /* Background read from tty (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGTTOU = 22, /* Background write to tty (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGURG = 23,
|
|
||||||
/* Urgent condition on socket (4.2 BSD) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGXCPU = 24, /* CPU limit exceeded (4.2 BSD) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGXFSZ = 25,
|
|
||||||
/* File size limit exceeded (4.2 BSD) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGVTALRM = 26, /* Virtual alarm clock (4.2 BSD) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGPROF = 27, /* Profiling alarm clock (4.2 BSD) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGWINCH = 28, /* Window size change (4.3 BSD, Sun) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGIO = 29, /* I/O now possible (4.2 BSD) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGPWR = 30, /* Power failure restart (System V) */
|
|
||||||
MD_EXCEPTION_CODE_LIN_SIGSYS = 31, /* Bad system call */
|
|
||||||
MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED = 0xFFFFFFFF /* No exception,
|
|
||||||
dump requested. */
|
|
||||||
} MDExceptionCodeLinux;
|
|
||||||
|
|
||||||
/* For (MDException).exception_flags. These values come from
|
|
||||||
* asm-generic/siginfo.h.
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
/* SIGILL */
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_ILLOPC = 1,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_ILLOPN = 2,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_ILLADR = 3,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_ILLTRP = 4,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_PRVOPC = 5,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_PRVREG = 6,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_COPROC = 7,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_ILL_BADSTK = 8,
|
|
||||||
|
|
||||||
/* SIGFPE */
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_INTDIV = 1,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_INTOVF = 2,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_FLTDIV = 3,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_FLTOVF = 4,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_FLTUND = 5,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_FLTRES = 6,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_FLTINV = 7,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_FPE_FLTSUB = 8,
|
|
||||||
|
|
||||||
/* SIGSEGV */
|
|
||||||
MD_EXCEPTION_FLAG_LIN_SEGV_MAPERR = 1,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR = 2,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR = 3,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR = 4,
|
|
||||||
|
|
||||||
/* SIGBUS */
|
|
||||||
MD_EXCEPTION_FLAG_LIN_BUS_ADRALN = 1,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_BUS_ADRERR = 2,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_BUS_OBJERR = 3,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AR = 4,
|
|
||||||
MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AO = 5,
|
|
||||||
} MDExceptionFlagLinux;
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */
|
|
||||||
|
|
@ -1,207 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_exception_mac.h: A definition of exception codes for Mac
|
|
||||||
* OS X
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai
|
|
||||||
* Split into its own file: Neal Sidhwaney */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
/* For (MDException).exception_code. Breakpad minidump extension for Mac OS X
|
|
||||||
* support. Based on Darwin/Mac OS X' mach/exception_types.h. This is
|
|
||||||
* what Mac OS X calls an "exception", not a "code". */
|
|
||||||
typedef enum {
|
|
||||||
/* Exception code. The high 16 bits of exception_code contains one of
|
|
||||||
* these values. */
|
|
||||||
MD_EXCEPTION_MAC_BAD_ACCESS = 1, /* code can be a kern_return_t */
|
|
||||||
/* EXC_BAD_ACCESS */
|
|
||||||
MD_EXCEPTION_MAC_BAD_INSTRUCTION = 2, /* code is CPU-specific */
|
|
||||||
/* EXC_BAD_INSTRUCTION */
|
|
||||||
MD_EXCEPTION_MAC_ARITHMETIC = 3, /* code is CPU-specific */
|
|
||||||
/* EXC_ARITHMETIC */
|
|
||||||
MD_EXCEPTION_MAC_EMULATION = 4, /* code is CPU-specific */
|
|
||||||
/* EXC_EMULATION */
|
|
||||||
MD_EXCEPTION_MAC_SOFTWARE = 5,
|
|
||||||
/* EXC_SOFTWARE */
|
|
||||||
MD_EXCEPTION_MAC_BREAKPOINT = 6, /* code is CPU-specific */
|
|
||||||
/* EXC_BREAKPOINT */
|
|
||||||
MD_EXCEPTION_MAC_SYSCALL = 7,
|
|
||||||
/* EXC_SYSCALL */
|
|
||||||
MD_EXCEPTION_MAC_MACH_SYSCALL = 8,
|
|
||||||
/* EXC_MACH_SYSCALL */
|
|
||||||
MD_EXCEPTION_MAC_RPC_ALERT = 9,
|
|
||||||
/* EXC_RPC_ALERT */
|
|
||||||
MD_EXCEPTION_MAC_SIMULATED = 0x43507378
|
|
||||||
/* Fake exception code used by Crashpad's SimulateCrash ('CPsx'). */
|
|
||||||
} MDExceptionMac;
|
|
||||||
|
|
||||||
/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X
|
|
||||||
* support. Based on Darwin/Mac OS X' mach/ppc/exception.h and
|
|
||||||
* mach/i386/exception.h. This is what Mac OS X calls a "code". */
|
|
||||||
typedef enum {
|
|
||||||
/* With MD_EXCEPTION_BAD_ACCESS. These are relevant kern_return_t values
|
|
||||||
* from mach/kern_return.h. */
|
|
||||||
MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS = 1,
|
|
||||||
/* KERN_INVALID_ADDRESS */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE = 2,
|
|
||||||
/* KERN_PROTECTION_FAILURE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_NO_ACCESS = 8,
|
|
||||||
/* KERN_NO_ACCESS */
|
|
||||||
MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE = 9,
|
|
||||||
/* KERN_MEMORY_FAILURE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_MEMORY_ERROR = 10,
|
|
||||||
/* KERN_MEMORY_ERROR */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_SOFTWARE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_BAD_SYSCALL = 0x00010000, /* Mach SIGSYS */
|
|
||||||
MD_EXCEPTION_CODE_MAC_BAD_PIPE = 0x00010001, /* Mach SIGPIPE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_ABORT = 0x00010002, /* Mach SIGABRT */
|
|
||||||
/* Custom values */
|
|
||||||
MD_EXCEPTION_CODE_MAC_NS_EXCEPTION = 0xDEADC0DE, /* uncaught NSException */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BAD_ACCESS on arm */
|
|
||||||
MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN = 0x0101, /* EXC_ARM_DA_ALIGN */
|
|
||||||
MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG = 0x0102, /* EXC_ARM_DA_DEBUG */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on arm */
|
|
||||||
MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED = 1, /* EXC_ARM_UNDEFINED */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BREAKPOINT on arm */
|
|
||||||
MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT = 1, /* EXC_ARM_BREAKPOINT */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101,
|
|
||||||
/* EXC_PPC_VM_PROT_READ */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_BADSPACE = 0x0102,
|
|
||||||
/* EXC_PPC_BADSPACE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED = 0x0103,
|
|
||||||
/* EXC_PPC_UNALIGNED */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on ppc */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL = 1,
|
|
||||||
/* EXC_PPC_INVALID_SYSCALL */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION = 2,
|
|
||||||
/* EXC_PPC_UNIPL_INST */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION = 3,
|
|
||||||
/* EXC_PPC_PRIVINST */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER = 4,
|
|
||||||
/* EXC_PPC_PRIVREG */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_TRACE = 5,
|
|
||||||
/* EXC_PPC_TRACE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR = 6,
|
|
||||||
/* EXC_PPC_PERFMON */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_ARITHMETIC on ppc */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW = 1,
|
|
||||||
/* EXC_PPC_OVERFLOW */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE = 2,
|
|
||||||
/* EXC_PPC_ZERO_DIVIDE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT = 3,
|
|
||||||
/* EXC_FLT_INEXACT */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE = 4,
|
|
||||||
/* EXC_PPC_FLT_ZERO_DIVIDE */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW = 5,
|
|
||||||
/* EXC_PPC_FLT_UNDERFLOW */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW = 6,
|
|
||||||
/* EXC_PPC_FLT_OVERFLOW */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER = 7,
|
|
||||||
/* EXC_PPC_FLT_NOT_A_NUMBER */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_EMULATION on ppc */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION = 8,
|
|
||||||
/* EXC_PPC_NOEMULATION */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST = 9,
|
|
||||||
/* EXC_PPC_ALTIVECASSIST */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_SOFTWARE on ppc */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_TRAP = 0x00000001, /* EXC_PPC_TRAP */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_MIGRATE = 0x00010100, /* EXC_PPC_MIGRATE */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BREAKPOINT on ppc */
|
|
||||||
MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT = 1, /* EXC_PPC_BREAKPOINT */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86, see also x86 interrupt
|
|
||||||
* values below. */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION = 1, /* EXC_I386_INVOP */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_ARITHMETIC on x86 */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_DIV = 1, /* EXC_I386_DIV */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_INTO = 2, /* EXC_I386_INTO */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_NOEXT = 3, /* EXC_I386_NOEXT */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_EXTOVR = 4, /* EXC_I386_EXTOVR */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_EXTERR = 5, /* EXC_I386_EXTERR */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_EMERR = 6, /* EXC_I386_EMERR */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_BOUND = 7, /* EXC_I386_BOUND */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR = 8, /* EXC_I386_SSEEXTERR */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BREAKPOINT on x86 */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_SGL = 1, /* EXC_I386_SGL */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_BPT = 2, /* EXC_I386_BPT */
|
|
||||||
|
|
||||||
/* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86. These are the raw
|
|
||||||
* x86 interrupt codes. Most of these are mapped to other Mach
|
|
||||||
* exceptions and codes, are handled, or should not occur in user space.
|
|
||||||
* A few of these will do occur with MD_EXCEPTION_MAC_BAD_INSTRUCTION. */
|
|
||||||
/* EXC_I386_DIVERR = 0: mapped to EXC_ARITHMETIC/EXC_I386_DIV */
|
|
||||||
/* EXC_I386_SGLSTP = 1: mapped to EXC_BREAKPOINT/EXC_I386_SGL */
|
|
||||||
/* EXC_I386_NMIFLT = 2: should not occur in user space */
|
|
||||||
/* EXC_I386_BPTFLT = 3: mapped to EXC_BREAKPOINT/EXC_I386_BPT */
|
|
||||||
/* EXC_I386_INTOFLT = 4: mapped to EXC_ARITHMETIC/EXC_I386_INTO */
|
|
||||||
/* EXC_I386_BOUNDFLT = 5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND */
|
|
||||||
/* EXC_I386_INVOPFLT = 6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP */
|
|
||||||
/* EXC_I386_NOEXTFLT = 7: should be handled by the kernel */
|
|
||||||
/* EXC_I386_DBLFLT = 8: should be handled (if possible) by the kernel */
|
|
||||||
/* EXC_I386_EXTOVRFLT = 9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC) */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT = 10,
|
|
||||||
/* EXC_INVTSSFLT */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT = 11,
|
|
||||||
/* EXC_SEGNPFLT */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT = 12,
|
|
||||||
/* EXC_STKFLT */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT = 13,
|
|
||||||
/* EXC_GPFLT */
|
|
||||||
/* EXC_I386_PGFLT = 14: should not occur in user space */
|
|
||||||
/* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */
|
|
||||||
MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT = 17
|
|
||||||
/* EXC_ALIGNFLT (for vector operations) */
|
|
||||||
/* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */
|
|
||||||
/* EXC_I386_ENDPERR = 33: should not occur */
|
|
||||||
} MDExceptionCodeMac;
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
/* Copyright (c) 2013, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_exception_ps3.h: A definition of exception codes for
|
|
||||||
* PS3 */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
MD_EXCEPTION_CODE_PS3_UNKNOWN = 0,
|
|
||||||
MD_EXCEPTION_CODE_PS3_TRAP_EXCEP = 1,
|
|
||||||
MD_EXCEPTION_CODE_PS3_PRIV_INSTR = 2,
|
|
||||||
MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR = 3,
|
|
||||||
MD_EXCEPTION_CODE_PS3_INSTR_STORAGE = 4,
|
|
||||||
MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT = 5,
|
|
||||||
MD_EXCEPTION_CODE_PS3_DATA_STORAGE = 6,
|
|
||||||
MD_EXCEPTION_CODE_PS3_DATA_SEGMENT = 7,
|
|
||||||
MD_EXCEPTION_CODE_PS3_FLOAT_POINT = 8,
|
|
||||||
MD_EXCEPTION_CODE_PS3_DABR_MATCH = 9,
|
|
||||||
MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP = 10,
|
|
||||||
MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS = 11,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_ALIGN = 12,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM = 13,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_ERR = 14,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_FIR = 15,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT = 16,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE = 17,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR = 18,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR = 19,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN = 20,
|
|
||||||
MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS = 21,
|
|
||||||
MD_EXCEPTION_CODE_PS3_GRAPHIC = 22
|
|
||||||
} MDExceptionCodePS3;
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__ */
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
||||||
/* Copyright (c) 2006, Google Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of Google Inc. nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
/* minidump_exception_solaris.h: A definition of exception codes for
|
|
||||||
* Solaris
|
|
||||||
*
|
|
||||||
* (This is C99 source, please don't corrupt it with C++.)
|
|
||||||
*
|
|
||||||
* Author: Mark Mentovai
|
|
||||||
* Split into its own file: Neal Sidhwaney */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/breakpad_types.h"
|
|
||||||
|
|
||||||
/* For (MDException).exception_code. These values come from sys/iso/signal_iso.h
|
|
||||||
*/
|
|
||||||
typedef enum {
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGHUP = 1, /* Hangup */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGINT = 2, /* interrupt (rubout) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGQUIT = 3, /* quit (ASCII FS) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGILL = 4, /* illegal instruction (not reset when caught) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGTRAP = 5, /* trace trap (not reset when caught) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGIOT = 6, /* IOT instruction */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGABRT = 6, /* used by abort, replace SIGIOT in the future */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGEMT = 7, /* EMT instruction */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGFPE = 8, /* floating point exception */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGKILL = 9, /* kill (cannot be caught or ignored) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGBUS = 10, /* bus error */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGSEGV = 11, /* segmentation violation */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGSYS = 12, /* bad argument to system call */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGPIPE = 13, /* write on a pipe with no one to read it */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGALRM = 14, /* alarm clock */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGTERM = 15, /* software termination signal from kill */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGUSR1 = 16, /* user defined signal 1 */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGUSR2 = 17, /* user defined signal 2 */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGCLD = 18, /* child status change */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGCHLD = 18, /* child status change alias (POSIX) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGPWR = 19, /* power-fail restart */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGWINCH = 20, /* window size change */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGURG = 21, /* urgent socket condition */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGPOLL = 22, /* pollable event occurred */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGIO = 22, /* socket I/O possible (SIGPOLL alias) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGSTOP = 23, /* stop (cannot be caught or ignored) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGTSTP = 24, /* user stop requested from tty */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGCONT = 25, /* stopped process has been continued */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGTTIN = 26, /* background tty read attempted */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGTTOU = 27, /* background tty write attempted */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGVTALRM = 28, /* virtual timer expired */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGPROF = 29, /* profiling timer expired */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGXCPU = 30, /* exceeded cpu limit */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGXFSZ = 31, /* exceeded file size limit */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGWAITING = 32, /* reserved signal no longer used by threading code */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGLWP = 33, /* reserved signal no longer used by threading code */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGFREEZE = 34, /* special signal used by CPR */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGTHAW = 35, /* special signal used by CPR */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGCANCEL = 36, /* reserved signal for thread cancellation */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGLOST = 37, /* resource lost (eg, record-lock lost) */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGXRES = 38, /* resource control exceeded */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGJVM1 = 39, /* reserved signal for Java Virtual Machine */
|
|
||||||
MD_EXCEPTION_CODE_SOL_SIGJVM2 = 40 /* reserved signal for Java Virtual Machine */
|
|
||||||
} MDExceptionCodeSolaris;
|
|
||||||
|
|
||||||
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ */
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,113 +0,0 @@
|
||||||
// Copyright (c) 2007, Google Inc.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions are
|
|
||||||
// met:
|
|
||||||
//
|
|
||||||
// * Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// * Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following disclaimer
|
|
||||||
// in the documentation and/or other materials provided with the
|
|
||||||
// distribution.
|
|
||||||
// * Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from
|
|
||||||
// this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
|
||||||
|
|
||||||
// minidump_size.h: Provides a C++ template for programmatic access to
|
|
||||||
// the sizes of various types defined in minidump_format.h.
|
|
||||||
//
|
|
||||||
// Author: Mark Mentovai
|
|
||||||
|
|
||||||
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__
|
|
||||||
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "google_breakpad/common/minidump_format.h"
|
|
||||||
|
|
||||||
namespace google_breakpad {
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
class minidump_size {
|
|
||||||
public:
|
|
||||||
static size_t size() { return sizeof(T); }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Explicit specializations for variable-length types. The size returned
|
|
||||||
// for these should be the size for an object without its variable-length
|
|
||||||
// section.
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDString> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDString_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDRawThreadList> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDRawThreadList_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDCVInfoPDB20> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDCVInfoPDB20_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDCVInfoPDB70> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDCVInfoPDB70_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDCVInfoELF> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDCVInfoELF_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDImageDebugMisc> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDImageDebugMisc_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDRawModuleList> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDRawModuleList_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDRawMemoryList> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MDRawMemoryList_minsize; }
|
|
||||||
};
|
|
||||||
|
|
||||||
// Explicit specialization for MDRawModule, for which sizeof may include
|
|
||||||
// tail-padding on some architectures but not others.
|
|
||||||
|
|
||||||
template<>
|
|
||||||
class minidump_size<MDRawModule> {
|
|
||||||
public:
|
|
||||||
static size_t size() { return MD_MODULE_SIZE; }
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace google_breakpad
|
|
||||||
|
|
||||||
#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,229 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_AAUDIO_LOADER_H_
|
|
||||||
#define OBOE_AAUDIO_LOADER_H_
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include "oboe/Definitions.h"
|
|
||||||
|
|
||||||
// If the NDK is before O then define this in your build
|
|
||||||
// so that AAudio.h will not be included.
|
|
||||||
#ifdef OBOE_NO_INCLUDE_AAUDIO
|
|
||||||
|
|
||||||
// Define missing types from AAudio.h
|
|
||||||
typedef int32_t aaudio_stream_state_t;
|
|
||||||
typedef int32_t aaudio_direction_t;
|
|
||||||
typedef int32_t aaudio_format_t;
|
|
||||||
typedef int32_t aaudio_data_callback_result_t;
|
|
||||||
typedef int32_t aaudio_result_t;
|
|
||||||
typedef int32_t aaudio_sharing_mode_t;
|
|
||||||
typedef int32_t aaudio_performance_mode_t;
|
|
||||||
|
|
||||||
typedef struct AAudioStreamStruct AAudioStream;
|
|
||||||
typedef struct AAudioStreamBuilderStruct AAudioStreamBuilder;
|
|
||||||
|
|
||||||
typedef aaudio_data_callback_result_t (*AAudioStream_dataCallback)(
|
|
||||||
AAudioStream *stream,
|
|
||||||
void *userData,
|
|
||||||
void *audioData,
|
|
||||||
int32_t numFrames);
|
|
||||||
|
|
||||||
typedef void (*AAudioStream_errorCallback)(
|
|
||||||
AAudioStream *stream,
|
|
||||||
void *userData,
|
|
||||||
aaudio_result_t error);
|
|
||||||
|
|
||||||
// These were defined in P
|
|
||||||
typedef int32_t aaudio_usage_t;
|
|
||||||
typedef int32_t aaudio_content_type_t;
|
|
||||||
typedef int32_t aaudio_input_preset_t;
|
|
||||||
typedef int32_t aaudio_session_id_t;
|
|
||||||
#else
|
|
||||||
#include <aaudio/AAudio.h>
|
|
||||||
#include <android/ndk-version.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __NDK_MAJOR__
|
|
||||||
#define __NDK_MAJOR__ 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The AAudio API was not available in early versions of Android.
|
|
||||||
* To avoid linker errors, we dynamically link with the functions by name using dlsym().
|
|
||||||
* On older versions this linkage will safely fail.
|
|
||||||
*/
|
|
||||||
class AAudioLoader {
|
|
||||||
public:
|
|
||||||
// Use signatures for common functions.
|
|
||||||
// Key to letter abbreviations.
|
|
||||||
// S = Stream
|
|
||||||
// B = Builder
|
|
||||||
// I = int32_t
|
|
||||||
// L = int64_t
|
|
||||||
// T = sTate
|
|
||||||
// K = clocKid_t
|
|
||||||
// P = Pointer to following data type
|
|
||||||
// C = Const prefix
|
|
||||||
// H = cHar
|
|
||||||
typedef int32_t (*signature_I_PPB)(AAudioStreamBuilder **builder);
|
|
||||||
|
|
||||||
typedef const char * (*signature_CPH_I)(int32_t);
|
|
||||||
|
|
||||||
typedef int32_t (*signature_I_PBPPS)(AAudioStreamBuilder *,
|
|
||||||
AAudioStream **stream); // AAudioStreamBuilder_open()
|
|
||||||
|
|
||||||
typedef int32_t (*signature_I_PB)(AAudioStreamBuilder *); // AAudioStreamBuilder_delete()
|
|
||||||
// AAudioStreamBuilder_setSampleRate()
|
|
||||||
typedef void (*signature_V_PBI)(AAudioStreamBuilder *, int32_t);
|
|
||||||
|
|
||||||
typedef int32_t (*signature_I_PS)(AAudioStream *); // AAudioStream_getSampleRate()
|
|
||||||
typedef int64_t (*signature_L_PS)(AAudioStream *); // AAudioStream_getFramesRead()
|
|
||||||
// AAudioStream_setBufferSizeInFrames()
|
|
||||||
typedef int32_t (*signature_I_PSI)(AAudioStream *, int32_t);
|
|
||||||
|
|
||||||
typedef void (*signature_V_PBPDPV)(AAudioStreamBuilder *,
|
|
||||||
AAudioStream_dataCallback,
|
|
||||||
void *);
|
|
||||||
|
|
||||||
typedef void (*signature_V_PBPEPV)(AAudioStreamBuilder *,
|
|
||||||
AAudioStream_errorCallback,
|
|
||||||
void *);
|
|
||||||
|
|
||||||
typedef aaudio_format_t (*signature_F_PS)(AAudioStream *stream);
|
|
||||||
|
|
||||||
typedef int32_t (*signature_I_PSPVIL)(AAudioStream *, void *, int32_t, int64_t);
|
|
||||||
typedef int32_t (*signature_I_PSCPVIL)(AAudioStream *, const void *, int32_t, int64_t);
|
|
||||||
|
|
||||||
typedef int32_t (*signature_I_PSTPTL)(AAudioStream *,
|
|
||||||
aaudio_stream_state_t,
|
|
||||||
aaudio_stream_state_t *,
|
|
||||||
int64_t);
|
|
||||||
|
|
||||||
typedef int32_t (*signature_I_PSKPLPL)(AAudioStream *, clockid_t, int64_t *, int64_t *);
|
|
||||||
|
|
||||||
typedef bool (*signature_B_PS)(AAudioStream *);
|
|
||||||
|
|
||||||
static AAudioLoader* getInstance(); // singleton
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open the AAudio shared library and load the function pointers.
|
|
||||||
* This can be called multiple times.
|
|
||||||
* It should only be called from one thread.
|
|
||||||
*
|
|
||||||
* The destructor will clean up after the open.
|
|
||||||
*
|
|
||||||
* @return 0 if successful or negative error.
|
|
||||||
*/
|
|
||||||
int open();
|
|
||||||
|
|
||||||
// Function pointers into the AAudio shared library.
|
|
||||||
signature_I_PPB createStreamBuilder = nullptr;
|
|
||||||
|
|
||||||
signature_I_PBPPS builder_openStream = nullptr;
|
|
||||||
|
|
||||||
signature_V_PBI builder_setBufferCapacityInFrames = nullptr;
|
|
||||||
signature_V_PBI builder_setChannelCount = nullptr;
|
|
||||||
signature_V_PBI builder_setDeviceId = nullptr;
|
|
||||||
signature_V_PBI builder_setDirection = nullptr;
|
|
||||||
signature_V_PBI builder_setFormat = nullptr;
|
|
||||||
signature_V_PBI builder_setFramesPerDataCallback = nullptr;
|
|
||||||
signature_V_PBI builder_setPerformanceMode = nullptr;
|
|
||||||
signature_V_PBI builder_setSampleRate = nullptr;
|
|
||||||
signature_V_PBI builder_setSharingMode = nullptr;
|
|
||||||
|
|
||||||
signature_V_PBI builder_setUsage = nullptr;
|
|
||||||
signature_V_PBI builder_setContentType = nullptr;
|
|
||||||
signature_V_PBI builder_setInputPreset = nullptr;
|
|
||||||
signature_V_PBI builder_setSessionId = nullptr;
|
|
||||||
|
|
||||||
signature_V_PBPDPV builder_setDataCallback = nullptr;
|
|
||||||
signature_V_PBPEPV builder_setErrorCallback = nullptr;
|
|
||||||
|
|
||||||
signature_I_PB builder_delete = nullptr;
|
|
||||||
|
|
||||||
signature_F_PS stream_getFormat = nullptr;
|
|
||||||
|
|
||||||
signature_I_PSPVIL stream_read = nullptr;
|
|
||||||
signature_I_PSCPVIL stream_write = nullptr;
|
|
||||||
|
|
||||||
signature_I_PSTPTL stream_waitForStateChange = nullptr;
|
|
||||||
|
|
||||||
signature_I_PSKPLPL stream_getTimestamp = nullptr;
|
|
||||||
|
|
||||||
signature_B_PS stream_isMMapUsed = nullptr;
|
|
||||||
|
|
||||||
signature_I_PS stream_close = nullptr;
|
|
||||||
|
|
||||||
signature_I_PS stream_getChannelCount = nullptr;
|
|
||||||
signature_I_PS stream_getDeviceId = nullptr;
|
|
||||||
|
|
||||||
signature_I_PS stream_getBufferSize = nullptr;
|
|
||||||
signature_I_PS stream_getBufferCapacity = nullptr;
|
|
||||||
signature_I_PS stream_getFramesPerBurst = nullptr;
|
|
||||||
signature_I_PS stream_getState = nullptr;
|
|
||||||
signature_I_PS stream_getPerformanceMode = nullptr;
|
|
||||||
signature_I_PS stream_getSampleRate = nullptr;
|
|
||||||
signature_I_PS stream_getSharingMode = nullptr;
|
|
||||||
signature_I_PS stream_getXRunCount = nullptr;
|
|
||||||
|
|
||||||
signature_I_PSI stream_setBufferSize = nullptr;
|
|
||||||
signature_I_PS stream_requestStart = nullptr;
|
|
||||||
signature_I_PS stream_requestPause = nullptr;
|
|
||||||
signature_I_PS stream_requestFlush = nullptr;
|
|
||||||
signature_I_PS stream_requestStop = nullptr;
|
|
||||||
|
|
||||||
signature_L_PS stream_getFramesRead = nullptr;
|
|
||||||
signature_L_PS stream_getFramesWritten = nullptr;
|
|
||||||
|
|
||||||
signature_CPH_I convertResultToText = nullptr;
|
|
||||||
|
|
||||||
signature_I_PS stream_getUsage = nullptr;
|
|
||||||
signature_I_PS stream_getContentType = nullptr;
|
|
||||||
signature_I_PS stream_getInputPreset = nullptr;
|
|
||||||
signature_I_PS stream_getSessionId = nullptr;
|
|
||||||
|
|
||||||
private:
|
|
||||||
AAudioLoader() {}
|
|
||||||
~AAudioLoader();
|
|
||||||
|
|
||||||
// Load function pointers for specific signatures.
|
|
||||||
signature_I_PPB load_I_PPB(const char *name);
|
|
||||||
signature_CPH_I load_CPH_I(const char *name);
|
|
||||||
signature_V_PBI load_V_PBI(const char *name);
|
|
||||||
signature_V_PBPDPV load_V_PBPDPV(const char *name);
|
|
||||||
signature_V_PBPEPV load_V_PBPEPV(const char *name);
|
|
||||||
signature_I_PB load_I_PB(const char *name);
|
|
||||||
signature_I_PBPPS load_I_PBPPS(const char *name);
|
|
||||||
signature_I_PS load_I_PS(const char *name);
|
|
||||||
signature_L_PS load_L_PS(const char *name);
|
|
||||||
signature_F_PS load_F_PS(const char *name);
|
|
||||||
signature_B_PS load_B_PS(const char *name);
|
|
||||||
signature_I_PSI load_I_PSI(const char *name);
|
|
||||||
signature_I_PSPVIL load_I_PSPVIL(const char *name);
|
|
||||||
signature_I_PSCPVIL load_I_PSCPVIL(const char *name);
|
|
||||||
signature_I_PSTPTL load_I_PSTPTL(const char *name);
|
|
||||||
signature_I_PSKPLPL load_I_PSKPLPL(const char *name);
|
|
||||||
|
|
||||||
void *mLibHandle = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace oboe
|
|
||||||
|
|
||||||
#endif //OBOE_AAUDIO_LOADER_H_
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_STREAM_AAUDIO_H_
|
|
||||||
#define OBOE_STREAM_AAUDIO_H_
|
|
||||||
|
|
||||||
#include <atomic>
|
|
||||||
#include <mutex>
|
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
#include "oboe/AudioStreamBuilder.h"
|
|
||||||
#include "oboe/AudioStream.h"
|
|
||||||
#include "oboe/Definitions.h"
|
|
||||||
#include "AAudioLoader.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Implementation of OboeStream that uses AAudio.
|
|
||||||
*
|
|
||||||
* Do not create this class directly.
|
|
||||||
* Use an OboeStreamBuilder to create one.
|
|
||||||
*/
|
|
||||||
class AudioStreamAAudio : public AudioStream {
|
|
||||||
public:
|
|
||||||
AudioStreamAAudio();
|
|
||||||
explicit AudioStreamAAudio(const AudioStreamBuilder &builder);
|
|
||||||
|
|
||||||
virtual ~AudioStreamAAudio() = default;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return true if AAudio is supported on this device.
|
|
||||||
*/
|
|
||||||
static bool isSupported();
|
|
||||||
|
|
||||||
// These functions override methods in AudioStream.
|
|
||||||
// See AudioStream for documentation.
|
|
||||||
Result open() override;
|
|
||||||
Result close() override;
|
|
||||||
|
|
||||||
Result requestStart() override;
|
|
||||||
Result requestPause() override;
|
|
||||||
Result requestFlush() override;
|
|
||||||
Result requestStop() override;
|
|
||||||
|
|
||||||
ResultWithValue<int32_t> write(const void *buffer,
|
|
||||||
int32_t numFrames,
|
|
||||||
int64_t timeoutNanoseconds) override;
|
|
||||||
|
|
||||||
ResultWithValue<int32_t> read(void *buffer,
|
|
||||||
int32_t numFrames,
|
|
||||||
int64_t timeoutNanoseconds) override;
|
|
||||||
|
|
||||||
ResultWithValue<int32_t> setBufferSizeInFrames(int32_t requestedFrames) override;
|
|
||||||
int32_t getBufferSizeInFrames() override;
|
|
||||||
int32_t getFramesPerBurst() override;
|
|
||||||
ResultWithValue<int32_t> getXRunCount() const override;
|
|
||||||
bool isXRunCountSupported() const override { return true; }
|
|
||||||
|
|
||||||
ResultWithValue<double> calculateLatencyMillis() override;
|
|
||||||
|
|
||||||
Result waitForStateChange(StreamState currentState,
|
|
||||||
StreamState *nextState,
|
|
||||||
int64_t timeoutNanoseconds) override;
|
|
||||||
|
|
||||||
Result getTimestamp(clockid_t clockId,
|
|
||||||
int64_t *framePosition,
|
|
||||||
int64_t *timeNanoseconds) override;
|
|
||||||
|
|
||||||
StreamState getState() const override;
|
|
||||||
|
|
||||||
AudioApi getAudioApi() const override {
|
|
||||||
return AudioApi::AAudio;
|
|
||||||
}
|
|
||||||
|
|
||||||
DataCallbackResult callOnAudioReady(AAudioStream *stream,
|
|
||||||
void *audioData,
|
|
||||||
int32_t numFrames);
|
|
||||||
|
|
||||||
bool isMMapUsed();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
static void internalErrorCallback(
|
|
||||||
AAudioStream *stream,
|
|
||||||
void *userData,
|
|
||||||
aaudio_result_t error);
|
|
||||||
|
|
||||||
void *getUnderlyingStream() const override {
|
|
||||||
return mAAudioStream.load();
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateFramesRead() override;
|
|
||||||
void updateFramesWritten() override;
|
|
||||||
|
|
||||||
void logUnsupportedAttributes();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Must call under mLock. And stream must NOT be nullptr.
|
|
||||||
Result requestStop_l(AAudioStream *stream);
|
|
||||||
|
|
||||||
// Time to sleep in order to prevent a race condition with a callback after a close().
|
|
||||||
// Two milliseconds may be enough but 10 msec is even safer.
|
|
||||||
static constexpr int kDelayBeforeCloseMillis = 10;
|
|
||||||
|
|
||||||
std::atomic<bool> mCallbackThreadEnabled;
|
|
||||||
|
|
||||||
// pointer to the underlying 'C' AAudio stream, valid if open, null if closed
|
|
||||||
std::atomic<AAudioStream *> mAAudioStream{nullptr};
|
|
||||||
|
|
||||||
static AAudioLoader *mLibLoader;
|
|
||||||
|
|
||||||
// We may not use this but it is so small that it is not worth allocating dynamically.
|
|
||||||
AudioStreamErrorCallback mDefaultErrorCallback;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace oboe
|
|
||||||
|
|
||||||
#endif // OBOE_STREAM_AAUDIO_H_
|
|
||||||
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2016 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_AUDIO_CLOCK_H
|
|
||||||
#define OBOE_AUDIO_CLOCK_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <ctime>
|
|
||||||
#include "oboe/Definitions.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
// TODO: Move this class into the public headers because it is useful when calculating stream latency
|
|
||||||
class AudioClock {
|
|
||||||
public:
|
|
||||||
static int64_t getNanoseconds(clockid_t clockId = CLOCK_MONOTONIC) {
|
|
||||||
struct timespec time;
|
|
||||||
int result = clock_gettime(clockId, &time);
|
|
||||||
if (result < 0) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return (time.tv_sec * kNanosPerSecond) + time.tv_nsec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sleep until the specified time.
|
|
||||||
*
|
|
||||||
* @param nanoTime time to wake up
|
|
||||||
* @param clockId CLOCK_MONOTONIC is default
|
|
||||||
* @return 0 or a negative error, eg. -EINTR
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int sleepUntilNanoTime(int64_t nanoTime, clockid_t clockId = CLOCK_MONOTONIC) {
|
|
||||||
struct timespec time;
|
|
||||||
time.tv_sec = nanoTime / kNanosPerSecond;
|
|
||||||
time.tv_nsec = nanoTime - (time.tv_sec * kNanosPerSecond);
|
|
||||||
return 0 - clock_nanosleep(clockId, TIMER_ABSTIME, &time, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sleep for the specified number of nanoseconds in real-time.
|
|
||||||
* Return immediately with 0 if a negative nanoseconds is specified.
|
|
||||||
*
|
|
||||||
* @param nanoseconds time to sleep
|
|
||||||
* @param clockId CLOCK_REALTIME is default
|
|
||||||
* @return 0 or a negative error, eg. -EINTR
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int sleepForNanos(int64_t nanoseconds, clockid_t clockId = CLOCK_REALTIME) {
|
|
||||||
if (nanoseconds > 0) {
|
|
||||||
struct timespec time;
|
|
||||||
time.tv_sec = nanoseconds / kNanosPerSecond;
|
|
||||||
time.tv_nsec = nanoseconds - (time.tv_sec * kNanosPerSecond);
|
|
||||||
return 0 - clock_nanosleep(clockId, 0, &time, NULL);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace oboe
|
|
||||||
|
|
||||||
#endif //OBOE_AUDIO_CLOCK_H
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_AUDIO_SOURCE_CALLER_H
|
|
||||||
#define OBOE_AUDIO_SOURCE_CALLER_H
|
|
||||||
|
|
||||||
#include "OboeDebug.h"
|
|
||||||
#include "oboe/Oboe.h"
|
|
||||||
|
|
||||||
#include "flowgraph/FlowGraphNode.h"
|
|
||||||
#include "FixedBlockReader.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
class AudioStreamCallback;
|
|
||||||
class AudioStream;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* For output streams that use a callback, call the application for more data.
|
|
||||||
* For input streams that do not use a callback, read from the stream.
|
|
||||||
*/
|
|
||||||
class AudioSourceCaller : public flowgraph::FlowGraphSource, public FixedBlockProcessor {
|
|
||||||
public:
|
|
||||||
AudioSourceCaller(int32_t channelCount, int32_t framesPerCallback, int32_t bytesPerSample)
|
|
||||||
: FlowGraphSource(channelCount)
|
|
||||||
, mBlockReader(*this) {
|
|
||||||
mBlockReader.open(channelCount * framesPerCallback * bytesPerSample);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the stream to use as a source of data.
|
|
||||||
* @param stream
|
|
||||||
*/
|
|
||||||
void setStream(oboe::AudioStream *stream) {
|
|
||||||
mStream = stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
oboe::AudioStream *getStream() {
|
|
||||||
return mStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Timeout value to use when calling audioStream->read().
|
|
||||||
* @param timeoutNanos Zero for no timeout or time in nanoseconds.
|
|
||||||
*/
|
|
||||||
void setTimeoutNanos(int64_t timeoutNanos) {
|
|
||||||
mTimeoutNanos = timeoutNanos;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t getTimeoutNanos() const {
|
|
||||||
return mTimeoutNanos;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called internally for block size adaptation.
|
|
||||||
* @param buffer
|
|
||||||
* @param numBytes
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t onProcessFixedBlock(uint8_t *buffer, int32_t numBytes) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
oboe::AudioStream *mStream = nullptr;
|
|
||||||
int64_t mTimeoutNanos = 0;
|
|
||||||
|
|
||||||
FixedBlockReader mBlockReader;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif //OBOE_AUDIO_SOURCE_CALLER_H
|
|
||||||
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_OBOE_FLOW_GRAPH_H
|
|
||||||
#define OBOE_OBOE_FLOW_GRAPH_H
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <flowgraph/ChannelCountConverter.h>
|
|
||||||
#include <flowgraph/MonoToMultiConverter.h>
|
|
||||||
#include <flowgraph/MultiToMonoConverter.h>
|
|
||||||
#include <flowgraph/SampleRateConverter.h>
|
|
||||||
#include <oboe/Definitions.h>
|
|
||||||
#include "AudioSourceCaller.h"
|
|
||||||
#include "FixedBlockWriter.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
class AudioStream;
|
|
||||||
class AudioSourceCaller;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert PCM channels, format and sample rate for optimal latency.
|
|
||||||
*/
|
|
||||||
class DataConversionFlowGraph : public FixedBlockProcessor {
|
|
||||||
public:
|
|
||||||
|
|
||||||
DataConversionFlowGraph()
|
|
||||||
: mBlockWriter(*this) {}
|
|
||||||
|
|
||||||
void setSource(const void *buffer, int32_t numFrames);
|
|
||||||
|
|
||||||
/** Connect several modules together to convert from source to sink.
|
|
||||||
* This should only be called once for each instance.
|
|
||||||
*
|
|
||||||
* @param sourceFormat
|
|
||||||
* @param sourceChannelCount
|
|
||||||
* @param sinkFormat
|
|
||||||
* @param sinkChannelCount
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
oboe::Result configure(oboe::AudioStream *sourceStream, oboe::AudioStream *sinkStream);
|
|
||||||
|
|
||||||
int32_t read(void *buffer, int32_t numFrames, int64_t timeoutNanos);
|
|
||||||
|
|
||||||
int32_t write(void *buffer, int32_t numFrames);
|
|
||||||
|
|
||||||
int32_t onProcessFixedBlock(uint8_t *buffer, int32_t numBytes) override;
|
|
||||||
|
|
||||||
DataCallbackResult getDataCallbackResult() {
|
|
||||||
return mCallbackResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::unique_ptr<flowgraph::FlowGraphSourceBuffered> mSource;
|
|
||||||
std::unique_ptr<AudioSourceCaller> mSourceCaller;
|
|
||||||
std::unique_ptr<flowgraph::MonoToMultiConverter> mMonoToMultiConverter;
|
|
||||||
std::unique_ptr<flowgraph::MultiToMonoConverter> mMultiToMonoConverter;
|
|
||||||
std::unique_ptr<flowgraph::ChannelCountConverter> mChannelCountConverter;
|
|
||||||
std::unique_ptr<resampler::MultiChannelResampler> mResampler;
|
|
||||||
std::unique_ptr<flowgraph::SampleRateConverter> mRateConverter;
|
|
||||||
std::unique_ptr<flowgraph::FlowGraphSink> mSink;
|
|
||||||
|
|
||||||
FixedBlockWriter mBlockWriter;
|
|
||||||
DataCallbackResult mCallbackResult = DataCallbackResult::Continue;
|
|
||||||
AudioStream *mFilterStream = nullptr;
|
|
||||||
std::unique_ptr<uint8_t[]> mAppBuffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif //OBOE_OBOE_FLOW_GRAPH_H
|
|
||||||
|
|
@ -1,222 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_FILTER_AUDIO_STREAM_H
|
|
||||||
#define OBOE_FILTER_AUDIO_STREAM_H
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <oboe/AudioStream.h>
|
|
||||||
#include "DataConversionFlowGraph.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An AudioStream that wraps another AudioStream and provides audio data conversion.
|
|
||||||
* Operations may include channel conversion, data format conversion and/or sample rate conversion.
|
|
||||||
*/
|
|
||||||
class FilterAudioStream : public AudioStream, AudioStreamCallback {
|
|
||||||
public:
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct an `AudioStream` using the given `AudioStreamBuilder` and a child AudioStream.
|
|
||||||
*
|
|
||||||
* This should only be called internally by AudioStreamBuilder.
|
|
||||||
* Ownership of childStream will be passed to this object.
|
|
||||||
*
|
|
||||||
* @param builder containing all the stream's attributes
|
|
||||||
*/
|
|
||||||
FilterAudioStream(const AudioStreamBuilder &builder, AudioStream *childStream)
|
|
||||||
: AudioStream(builder)
|
|
||||||
, mChildStream(childStream) {
|
|
||||||
// Intercept the callback if used.
|
|
||||||
if (builder.isErrorCallbackSpecified()) {
|
|
||||||
mErrorCallback = mChildStream->swapErrorCallback(this);
|
|
||||||
}
|
|
||||||
if (builder.isDataCallbackSpecified()) {
|
|
||||||
mDataCallback = mChildStream->swapDataCallback(this);
|
|
||||||
} else {
|
|
||||||
const int size = childStream->getFramesPerBurst() * childStream->getBytesPerFrame();
|
|
||||||
mBlockingBuffer = std::make_unique<uint8_t[]>(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy parameters that may not match builder.
|
|
||||||
mBufferCapacityInFrames = mChildStream->getBufferCapacityInFrames();
|
|
||||||
mPerformanceMode = mChildStream->getPerformanceMode();
|
|
||||||
mInputPreset = mChildStream->getInputPreset();
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual ~FilterAudioStream() = default;
|
|
||||||
|
|
||||||
AudioStream *getChildStream() const {
|
|
||||||
return mChildStream.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result configureFlowGraph();
|
|
||||||
|
|
||||||
// Close child and parent.
|
|
||||||
Result close() override {
|
|
||||||
const Result result1 = mChildStream->close();
|
|
||||||
const Result result2 = AudioStream::close();
|
|
||||||
return (result1 != Result::OK ? result1 : result2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Start the stream asynchronously. Returns immediately (does not block). Equivalent to calling
|
|
||||||
* `start(0)`.
|
|
||||||
*/
|
|
||||||
Result requestStart() override {
|
|
||||||
return mChildStream->requestStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pause the stream asynchronously. Returns immediately (does not block). Equivalent to calling
|
|
||||||
* `pause(0)`.
|
|
||||||
*/
|
|
||||||
Result requestPause() override {
|
|
||||||
return mChildStream->requestPause();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flush the stream asynchronously. Returns immediately (does not block). Equivalent to calling
|
|
||||||
* `flush(0)`.
|
|
||||||
*/
|
|
||||||
Result requestFlush() override {
|
|
||||||
return mChildStream->requestFlush();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop the stream asynchronously. Returns immediately (does not block). Equivalent to calling
|
|
||||||
* `stop(0)`.
|
|
||||||
*/
|
|
||||||
Result requestStop() override {
|
|
||||||
return mChildStream->requestStop();
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultWithValue<int32_t> read(void *buffer,
|
|
||||||
int32_t numFrames,
|
|
||||||
int64_t timeoutNanoseconds) override;
|
|
||||||
|
|
||||||
ResultWithValue<int32_t> write(const void *buffer,
|
|
||||||
int32_t numFrames,
|
|
||||||
int64_t timeoutNanoseconds) override;
|
|
||||||
|
|
||||||
StreamState getState() const override {
|
|
||||||
return mChildStream->getState();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result waitForStateChange(
|
|
||||||
StreamState inputState,
|
|
||||||
StreamState *nextState,
|
|
||||||
int64_t timeoutNanoseconds) override {
|
|
||||||
return mChildStream->waitForStateChange(inputState, nextState, timeoutNanoseconds);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isXRunCountSupported() const override {
|
|
||||||
return mChildStream->isXRunCountSupported();
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t getFramesPerBurst() override {
|
|
||||||
return mChildStream->getFramesPerBurst();
|
|
||||||
}
|
|
||||||
|
|
||||||
AudioApi getAudioApi() const override {
|
|
||||||
return mChildStream->getAudioApi();
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateFramesWritten() override {
|
|
||||||
// TODO for output, just count local writes?
|
|
||||||
mFramesWritten = static_cast<int64_t>(mChildStream->getFramesWritten() * mRateScaler);
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateFramesRead() override {
|
|
||||||
// TODO for input, just count local reads?
|
|
||||||
mFramesRead = static_cast<int64_t>(mChildStream->getFramesRead() * mRateScaler);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *getUnderlyingStream() const override {
|
|
||||||
return mChildStream->getUnderlyingStream();
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultWithValue<int32_t> setBufferSizeInFrames(int32_t requestedFrames) override {
|
|
||||||
return mChildStream->setBufferSizeInFrames(requestedFrames);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t getBufferSizeInFrames() override {
|
|
||||||
mBufferSizeInFrames = mChildStream->getBufferSizeInFrames();
|
|
||||||
return mBufferSizeInFrames;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultWithValue<int32_t> getXRunCount() const override {
|
|
||||||
return mChildStream->getXRunCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultWithValue<double> calculateLatencyMillis() override {
|
|
||||||
// This will automatically include the latency of the flowgraph?
|
|
||||||
return mChildStream->calculateLatencyMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
Result getTimestamp(clockid_t clockId,
|
|
||||||
int64_t *framePosition,
|
|
||||||
int64_t *timeNanoseconds) override {
|
|
||||||
int64_t childPosition = 0;
|
|
||||||
Result result = mChildStream->getTimestamp(clockId, &childPosition, timeNanoseconds);
|
|
||||||
*framePosition = childPosition * mRateScaler;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
DataCallbackResult onAudioReady(AudioStream *oboeStream,
|
|
||||||
void *audioData,
|
|
||||||
int32_t numFrames) override;
|
|
||||||
|
|
||||||
bool onError(AudioStream * audioStream, Result error) override {
|
|
||||||
if (mErrorCallback != nullptr) {
|
|
||||||
return mErrorCallback->onError(this, error);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void onErrorBeforeClose(AudioStream *oboeStream, Result error) override {
|
|
||||||
if (mErrorCallback != nullptr) {
|
|
||||||
mErrorCallback->onErrorBeforeClose(this, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void onErrorAfterClose(AudioStream *oboeStream, Result error) override {
|
|
||||||
// Close this parent stream because the callback will only close the child.
|
|
||||||
AudioStream::close();
|
|
||||||
if (mErrorCallback != nullptr) {
|
|
||||||
mErrorCallback->onErrorAfterClose(this, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return last result passed from an error callback
|
|
||||||
*/
|
|
||||||
oboe::Result getLastErrorCallbackResult() const override {
|
|
||||||
return mChildStream->getLastErrorCallbackResult();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
std::unique_ptr<AudioStream> mChildStream; // this stream wraps the child stream
|
|
||||||
std::unique_ptr<DataConversionFlowGraph> mFlowGraph; // for converting data
|
|
||||||
std::unique_ptr<uint8_t[]> mBlockingBuffer; // temp buffer for write()
|
|
||||||
double mRateScaler = 1.0; // ratio parent/child sample rates
|
|
||||||
};
|
|
||||||
|
|
||||||
} // oboe
|
|
||||||
|
|
||||||
#endif //OBOE_FILTER_AUDIO_STREAM_H
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AAUDIO_FIXED_BLOCK_ADAPTER_H
|
|
||||||
#define AAUDIO_FIXED_BLOCK_ADAPTER_H
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Interface for a class that needs fixed-size blocks.
|
|
||||||
*/
|
|
||||||
class FixedBlockProcessor {
|
|
||||||
public:
|
|
||||||
virtual ~FixedBlockProcessor() = default;
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param buffer Pointer to first byte of data.
|
|
||||||
* @param numBytes This will be a fixed size specified in FixedBlockAdapter::open().
|
|
||||||
* @return Number of bytes processed or a negative error code.
|
|
||||||
*/
|
|
||||||
virtual int32_t onProcessFixedBlock(uint8_t *buffer, int32_t numBytes) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for a variable-to-fixed-size block adapter.
|
|
||||||
*/
|
|
||||||
class FixedBlockAdapter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FixedBlockAdapter(FixedBlockProcessor &fixedBlockProcessor)
|
|
||||||
: mFixedBlockProcessor(fixedBlockProcessor) {}
|
|
||||||
|
|
||||||
virtual ~FixedBlockAdapter();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Allocate internal resources needed for buffering data.
|
|
||||||
*/
|
|
||||||
virtual int32_t open(int32_t bytesPerFixedBlock);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Free internal resources.
|
|
||||||
*/
|
|
||||||
int32_t close();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
FixedBlockProcessor &mFixedBlockProcessor;
|
|
||||||
std::unique_ptr<uint8_t[]> mStorage; // Store data here while assembling buffers.
|
|
||||||
int32_t mSize = 0; // Size in bytes of the fixed size buffer.
|
|
||||||
int32_t mPosition = 0; // Offset of the last byte read or written.
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* AAUDIO_FIXED_BLOCK_ADAPTER_H */
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AAUDIO_FIXED_BLOCK_READER_H
|
|
||||||
#define AAUDIO_FIXED_BLOCK_READER_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "FixedBlockAdapter.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read from a fixed-size block to a variable sized block.
|
|
||||||
*
|
|
||||||
* This can be used to convert a pull data flow from fixed sized buffers to variable sized buffers.
|
|
||||||
* An example would be an audio output callback that reads from the app.
|
|
||||||
*/
|
|
||||||
class FixedBlockReader : public FixedBlockAdapter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FixedBlockReader(FixedBlockProcessor &fixedBlockProcessor);
|
|
||||||
|
|
||||||
virtual ~FixedBlockReader() = default;
|
|
||||||
|
|
||||||
int32_t open(int32_t bytesPerFixedBlock) override;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read into a variable sized block.
|
|
||||||
*
|
|
||||||
* Note that if the fixed-sized blocks must be aligned, then the variable-sized blocks
|
|
||||||
* must have the same alignment.
|
|
||||||
* For example, if the fixed-size blocks must be a multiple of 8, then the variable-sized
|
|
||||||
* blocks must also be a multiple of 8.
|
|
||||||
*
|
|
||||||
* @param buffer
|
|
||||||
* @param numBytes
|
|
||||||
* @return Number of bytes read or a negative error code.
|
|
||||||
*/
|
|
||||||
int32_t read(uint8_t *buffer, int32_t numBytes);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int32_t readFromStorage(uint8_t *buffer, int32_t numBytes);
|
|
||||||
|
|
||||||
int32_t mValid = 0; // Number of valid bytes in mStorage.
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* AAUDIO_FIXED_BLOCK_READER_H */
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2017 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef AAUDIO_FIXED_BLOCK_WRITER_H
|
|
||||||
#define AAUDIO_FIXED_BLOCK_WRITER_H
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "FixedBlockAdapter.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This can be used to convert a push data flow from variable sized buffers to fixed sized buffers.
|
|
||||||
* An example would be an audio input callback.
|
|
||||||
*/
|
|
||||||
class FixedBlockWriter : public FixedBlockAdapter
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
FixedBlockWriter(FixedBlockProcessor &fixedBlockProcessor);
|
|
||||||
|
|
||||||
virtual ~FixedBlockWriter() = default;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write from a variable sized block.
|
|
||||||
*
|
|
||||||
* Note that if the fixed-sized blocks must be aligned, then the variable-sized blocks
|
|
||||||
* must have the same alignment.
|
|
||||||
* For example, if the fixed-size blocks must be a multiple of 8, then the variable-sized
|
|
||||||
* blocks must also be a multiple of 8.
|
|
||||||
*
|
|
||||||
* @param buffer
|
|
||||||
* @param numBytes
|
|
||||||
* @return Number of bytes written or a negative error code.
|
|
||||||
*/
|
|
||||||
int32_t write(uint8_t *buffer, int32_t numBytes);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
int32_t writeToStorage(uint8_t *buffer, int32_t numBytes);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* AAUDIO_FIXED_BLOCK_WRITER_H */
|
|
||||||
|
|
@ -1,112 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2016 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef COMMON_MONOTONIC_COUNTER_H
|
|
||||||
#define COMMON_MONOTONIC_COUNTER_H
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Maintain a 64-bit monotonic counter.
|
|
||||||
* Can be used to track a 32-bit counter that wraps or gets reset.
|
|
||||||
*
|
|
||||||
* Note that this is not atomic and has no interior locks.
|
|
||||||
* A caller will need to provide their own exterior locking
|
|
||||||
* if they need to use it from multiple threads.
|
|
||||||
*/
|
|
||||||
class MonotonicCounter {
|
|
||||||
|
|
||||||
public:
|
|
||||||
MonotonicCounter() {}
|
|
||||||
virtual ~MonotonicCounter() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return current value of the counter
|
|
||||||
*/
|
|
||||||
int64_t get() const {
|
|
||||||
return mCounter64;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set the current value of the counter
|
|
||||||
*/
|
|
||||||
void set(int64_t counter) {
|
|
||||||
mCounter64 = counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Advance the counter if delta is positive.
|
|
||||||
* @return current value of the counter
|
|
||||||
*/
|
|
||||||
int64_t increment(int64_t delta) {
|
|
||||||
if (delta > 0) {
|
|
||||||
mCounter64 += delta;
|
|
||||||
}
|
|
||||||
return mCounter64;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Advance the 64-bit counter if (current32 - previousCurrent32) > 0.
|
|
||||||
* This can be used to convert a 32-bit counter that may be wrapping into
|
|
||||||
* a monotonic 64-bit counter.
|
|
||||||
*
|
|
||||||
* This counter32 should NOT be allowed to advance by more than 0x7FFFFFFF between calls.
|
|
||||||
* Think of the wrapping counter like a sine wave. If the frequency of the signal
|
|
||||||
* is more than half the sampling rate (Nyquist rate) then you cannot measure it properly.
|
|
||||||
* If the counter wraps around every 24 hours then we should measure it with a period
|
|
||||||
* of less than 12 hours.
|
|
||||||
*
|
|
||||||
* @return current value of the 64-bit counter
|
|
||||||
*/
|
|
||||||
int64_t update32(int32_t counter32) {
|
|
||||||
int32_t delta = counter32 - mCounter32;
|
|
||||||
// protect against the mCounter64 going backwards
|
|
||||||
if (delta > 0) {
|
|
||||||
mCounter64 += delta;
|
|
||||||
mCounter32 = counter32;
|
|
||||||
}
|
|
||||||
return mCounter64;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the stored value of the 32-bit counter.
|
|
||||||
* This is used if your counter32 has been reset to zero.
|
|
||||||
*/
|
|
||||||
void reset32() {
|
|
||||||
mCounter32 = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Round 64-bit counter up to a multiple of the period.
|
|
||||||
*
|
|
||||||
* The period must be positive.
|
|
||||||
*
|
|
||||||
* @param period might be, for example, a buffer capacity
|
|
||||||
*/
|
|
||||||
void roundUp64(int32_t period) {
|
|
||||||
if (period > 0) {
|
|
||||||
int64_t numPeriods = (mCounter64 + period - 1) / period;
|
|
||||||
mCounter64 = numPeriods * period;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int64_t mCounter64 = 0;
|
|
||||||
int32_t mCounter32 = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //COMMON_MONOTONIC_COUNTER_H
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2015 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_DEBUG_H
|
|
||||||
#define OBOE_DEBUG_H
|
|
||||||
|
|
||||||
#include <android/log.h>
|
|
||||||
|
|
||||||
#ifndef MODULE_NAME
|
|
||||||
#define MODULE_NAME "OboeAudio"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Always log INFO and errors.
|
|
||||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, MODULE_NAME, __VA_ARGS__)
|
|
||||||
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, MODULE_NAME, __VA_ARGS__)
|
|
||||||
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, MODULE_NAME, __VA_ARGS__)
|
|
||||||
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL, MODULE_NAME, __VA_ARGS__)
|
|
||||||
|
|
||||||
#if OBOE_ENABLE_LOGGING
|
|
||||||
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, MODULE_NAME, __VA_ARGS__)
|
|
||||||
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, MODULE_NAME, __VA_ARGS__)
|
|
||||||
#else
|
|
||||||
#define LOGV(...)
|
|
||||||
#define LOGD(...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif //OBOE_DEBUG_H
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_QUIRKS_MANAGER_H
|
|
||||||
#define OBOE_QUIRKS_MANAGER_H
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <oboe/AudioStreamBuilder.h>
|
|
||||||
#include <aaudio/AudioStreamAAudio.h>
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* INTERNAL USE ONLY.
|
|
||||||
*
|
|
||||||
* Based on manufacturer, model and Android version number
|
|
||||||
* decide whether data conversion needs to occur.
|
|
||||||
*
|
|
||||||
* This also manages device and version specific workarounds.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QuirksManager {
|
|
||||||
public:
|
|
||||||
|
|
||||||
static QuirksManager &getInstance() {
|
|
||||||
static QuirksManager instance; // singleton
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
QuirksManager();
|
|
||||||
virtual ~QuirksManager() = default;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Do we need to do channel, format or rate conversion to provide a low latency
|
|
||||||
* stream for this builder? If so then provide a builder for the native child stream
|
|
||||||
* that will be used to get low latency.
|
|
||||||
*
|
|
||||||
* @param builder builder provided by application
|
|
||||||
* @param childBuilder modified builder appropriate for the underlying device
|
|
||||||
* @return true if conversion is needed
|
|
||||||
*/
|
|
||||||
bool isConversionNeeded(const AudioStreamBuilder &builder, AudioStreamBuilder &childBuilder);
|
|
||||||
|
|
||||||
static bool isMMapUsed(AudioStream &stream) {
|
|
||||||
bool answer = false;
|
|
||||||
if (stream.getAudioApi() == AudioApi::AAudio) {
|
|
||||||
AudioStreamAAudio *streamAAudio =
|
|
||||||
reinterpret_cast<AudioStreamAAudio *>(&stream);
|
|
||||||
answer = streamAAudio->isMMapUsed();
|
|
||||||
}
|
|
||||||
return answer;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int32_t clipBufferSize(AudioStream &stream, int32_t bufferSize) {
|
|
||||||
return mDeviceQuirks->clipBufferSize(stream, bufferSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
class DeviceQuirks {
|
|
||||||
public:
|
|
||||||
virtual ~DeviceQuirks() = default;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Restrict buffer size. This is mainly to avoid glitches caused by MMAP
|
|
||||||
* timestamp inaccuracies.
|
|
||||||
* @param stream
|
|
||||||
* @param requestedSize
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t clipBufferSize(AudioStream &stream, int32_t requestedSize);
|
|
||||||
|
|
||||||
// Exclusive MMAP streams can have glitches because they are using a timing
|
|
||||||
// model of the DSP to control IO instead of direct synchronization.
|
|
||||||
virtual int32_t getExclusiveBottomMarginInBursts() const {
|
|
||||||
return kDefaultBottomMarginInBursts;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual int32_t getExclusiveTopMarginInBursts() const {
|
|
||||||
return kDefaultTopMarginInBursts;
|
|
||||||
}
|
|
||||||
|
|
||||||
// On some devices, you can open a mono stream but it is actually running in stereo!
|
|
||||||
virtual bool isMonoMMapActuallyStereo() const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual bool isAAudioMMapPossible(const AudioStreamBuilder &builder) const;
|
|
||||||
|
|
||||||
static constexpr int32_t kDefaultBottomMarginInBursts = 0;
|
|
||||||
static constexpr int32_t kDefaultTopMarginInBursts = 0;
|
|
||||||
|
|
||||||
// For Legacy streams, do not let the buffer go below one burst.
|
|
||||||
// b/129545119 | AAudio Legacy allows setBufferSizeInFrames too low
|
|
||||||
// Fixed in Q
|
|
||||||
static constexpr int32_t kLegacyBottomMarginInBursts = 1;
|
|
||||||
static constexpr int32_t kCommonNativeRate = 48000; // very typical native sample rate
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
static constexpr int32_t kChannelCountMono = 1;
|
|
||||||
static constexpr int32_t kChannelCountStereo = 2;
|
|
||||||
|
|
||||||
std::unique_ptr<DeviceQuirks> mDeviceQuirks{};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif //OBOE_QUIRKS_MANAGER_H
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
# Notes on Implementation
|
|
||||||
|
|
||||||
## Latency from Resampling
|
|
||||||
|
|
||||||
There are two components of the latency. The resampler itself, and a buffer that
|
|
||||||
is used to adapt the block sizes.
|
|
||||||
|
|
||||||
1) The resampler is an FIR running at the target sample rate. So its latency is the number of taps.
|
|
||||||
From MultiChannelResampler.cpp, numTaps is
|
|
||||||
|
|
||||||
Fastest: 2
|
|
||||||
Low: 4
|
|
||||||
Medium: 8
|
|
||||||
High: 16
|
|
||||||
Best: 32
|
|
||||||
|
|
||||||
For output, the device sampling rate is used, which is typically 48000.For input, the app sampling rate is used.
|
|
||||||
|
|
||||||
2) There is a block size adapter that collects odd sized blocks into larger blocks of the correct size.
|
|
||||||
|
|
||||||
The adapter contains one burst of frames, from getFramesPerBurst(). But if the app specifies a
|
|
||||||
particular size using setFramesPerCallback() then that size will be used.
|
|
||||||
Here is some pseudo-code to calculate the latency.
|
|
||||||
|
|
||||||
latencyMillis = 0
|
|
||||||
targetRate = isOutput ? deviceRate : applicationRate
|
|
||||||
// Add latency from FIR
|
|
||||||
latencyMillis += numTaps * 1000.0 / targetRate
|
|
||||||
// Add latency from block size adaptation
|
|
||||||
adapterSize = (callbackSize > 0) ? callbackSize : burstSize
|
|
||||||
if (isOutput && isCallbackUsed) latencyMillis += adapterSize * 1000.0 / deviceRate
|
|
||||||
else if (isInput && isCallbackUsed) latencyMillis += adapterSize * 1000.0 / applicationRate
|
|
||||||
else if (isInput && !isCallbackUsed) latencyMillis += adapterSize * 1000.0 / deviceRate
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_SOURCE_FLOAT_CALLER_H
|
|
||||||
#define OBOE_SOURCE_FLOAT_CALLER_H
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "flowgraph/FlowGraphNode.h"
|
|
||||||
#include "AudioSourceCaller.h"
|
|
||||||
#include "FixedBlockReader.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
/**
|
|
||||||
* AudioSource that uses callback to get more float data.
|
|
||||||
*/
|
|
||||||
class SourceFloatCaller : public AudioSourceCaller {
|
|
||||||
public:
|
|
||||||
SourceFloatCaller(int32_t channelCount, int32_t framesPerCallback)
|
|
||||||
: AudioSourceCaller(channelCount, framesPerCallback, (int32_t)sizeof(float)) {}
|
|
||||||
|
|
||||||
int32_t onProcess(int32_t numFrames) override;
|
|
||||||
|
|
||||||
const char *getName() override {
|
|
||||||
return "SourceFloatCaller";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif //OBOE_SOURCE_FLOAT_CALLER_H
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2019 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_SOURCE_I16_CALLER_H
|
|
||||||
#define OBOE_SOURCE_I16_CALLER_H
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "flowgraph/FlowGraphNode.h"
|
|
||||||
#include "AudioSourceCaller.h"
|
|
||||||
#include "FixedBlockReader.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
/**
|
|
||||||
* AudioSource that uses callback to get more data.
|
|
||||||
*/
|
|
||||||
class SourceI16Caller : public AudioSourceCaller {
|
|
||||||
public:
|
|
||||||
SourceI16Caller(int32_t channelCount, int32_t framesPerCallback)
|
|
||||||
: AudioSourceCaller(channelCount, framesPerCallback, sizeof(int16_t)) {
|
|
||||||
mConversionBuffer = std::make_unique<int16_t[]>(channelCount * output.getFramesPerBuffer());
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t onProcess(int32_t numFrames) override;
|
|
||||||
|
|
||||||
const char *getName() override {
|
|
||||||
return "SourceI16Caller";
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
std::unique_ptr<int16_t[]> mConversionBuffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif //OBOE_SOURCE_I16_CALLER_H
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2018 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_TRACE_H
|
|
||||||
#define OBOE_TRACE_H
|
|
||||||
|
|
||||||
class Trace {
|
|
||||||
|
|
||||||
public:
|
|
||||||
static void beginSection(const char *format, ...);
|
|
||||||
static void endSection();
|
|
||||||
static void initialize();
|
|
||||||
|
|
||||||
private:
|
|
||||||
static bool mIsTracingSupported;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //OBOE_TRACE_H
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2015 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBOE_FIFOPROCESSOR_H
|
|
||||||
#define OBOE_FIFOPROCESSOR_H
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#include "oboe/Definitions.h"
|
|
||||||
|
|
||||||
#include "FifoControllerBase.h"
|
|
||||||
|
|
||||||
namespace oboe {
|
|
||||||
|
|
||||||
class FifoBuffer {
|
|
||||||
public:
|
|
||||||
FifoBuffer(uint32_t bytesPerFrame, uint32_t capacityInFrames);
|
|
||||||
|
|
||||||
FifoBuffer(uint32_t bytesPerFrame,
|
|
||||||
uint32_t capacityInFrames,
|
|
||||||
std::atomic<uint64_t> *readCounterAddress,
|
|
||||||
std::atomic<uint64_t> *writeCounterAddress,
|
|
||||||
uint8_t *dataStorageAddress);
|
|
||||||
|
|
||||||
~FifoBuffer();
|
|
||||||
|
|
||||||
int32_t convertFramesToBytes(int32_t frames);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read framesToRead or, if not enough, then read as many as are available.
|
|
||||||
* @param destination
|
|
||||||
* @param framesToRead number of frames requested
|
|
||||||
* @return number of frames actually read
|
|
||||||
*/
|
|
||||||
int32_t read(void *destination, int32_t framesToRead);
|
|
||||||
|
|
||||||
int32_t write(const void *source, int32_t framesToWrite);
|
|
||||||
|
|
||||||
uint32_t getBufferCapacityInFrames() const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calls read(). If all of the frames cannot be read then the remainder of the buffer
|
|
||||||
* is set to zero.
|
|
||||||
*
|
|
||||||
* @param destination
|
|
||||||
* @param framesToRead number of frames requested
|
|
||||||
* @return number of frames actually read
|
|
||||||
*/
|
|
||||||
int32_t readNow(void *destination, int32_t numFrames);
|
|
||||||
|
|
||||||
uint32_t getFullFramesAvailable() {
|
|
||||||
return mFifo->getFullFramesAvailable();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t getBytesPerFrame() const {
|
|
||||||
return mBytesPerFrame;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t getReadCounter() const {
|
|
||||||
return mFifo->getReadCounter();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setReadCounter(uint64_t n) {
|
|
||||||
mFifo->setReadCounter(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t getWriteCounter() {
|
|
||||||
return mFifo->getWriteCounter();
|
|
||||||
}
|
|
||||||
void setWriteCounter(uint64_t n) {
|
|
||||||
mFifo->setWriteCounter(n);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint32_t mBytesPerFrame;
|
|
||||||
uint8_t* mStorage;
|
|
||||||
bool mStorageOwned; // did this object allocate the storage?
|
|
||||||
std::unique_ptr<FifoControllerBase> mFifo;
|
|
||||||
uint64_t mFramesReadCount;
|
|
||||||
uint64_t mFramesUnderrunCount;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace oboe
|
|
||||||
|
|
||||||
#endif //OBOE_FIFOPROCESSOR_H
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue