Index: client/crashpad_info.cc |
diff --git a/client/crashpad_info.cc b/client/crashpad_info.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7ff0f4a405d53f9c34045745385ed6496354cb80 |
--- /dev/null |
+++ b/client/crashpad_info.cc |
@@ -0,0 +1,76 @@ |
+// Copyright 2014 The Crashpad Authors. All rights reserved. |
+// |
+// 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. |
+ |
+#include "client/crashpad_info.h" |
+ |
+#include <mach-o/loader.h> |
+ |
+#if CXX_LIBRARY_VERSION >= 2011 |
+#include <type_traits> |
+#endif |
+ |
+namespace { |
+ |
+static const uint32_t kCrashpadInfoVersion = 1; |
+ |
+} // namespace |
+ |
+namespace crashpad { |
+ |
+#if CXX_LIBRARY_VERSION >= 2011 |
+// In C++11, check that CrashpadInfo has standard layout, which is what is |
+// actually important. |
+static_assert(std::is_standard_layout<CrashpadInfo>::value, |
+ "CrashpadInfo must be standard layout"); |
+#else |
+// In C++98 (ISO 14882), section 9.5.1 says that a union cannot have a member |
+// with a non-trivial ctor, copy ctor, dtor, or assignment operator. Use this |
+// property to ensure that CrashpadInfo remains POD. This doesn’t work for C++11 |
+// because the requirements for unions have been relaxed. |
+union Compile_Assert { |
+ CrashpadInfo Compile_Assert__CrashpadInfo_must_be_pod; |
+}; |
+#endif |
+ |
+// Put the structure in __DATA,__crashpad_info where it can be easily found |
+// without having to consult the symbol table. The “used” attribute prevents it |
+// from being dead-stripped. This isn’t placed in an unnamed namespace: |
+// hopefully, this will catch attempts to place multiple copies of this |
+// structure into the same module. If that’s attempted, and the name of the |
+// symbol is the same in each translation unit, it will result in a linker |
+// error, which is better than having multiple structures show up. |
+// |
+// This may result in a static module initializer in debug-mode builds, but |
+// because it’s POD, no code should need to run to initialize this under |
+// release-mode optimization. |
+__attribute__((section(SEG_DATA ",__crashpad_info"), |
+ used, |
+ visibility("hidden"))) CrashpadInfo g_crashpad_info; |
+ |
+// static |
+CrashpadInfo* CrashpadInfo::GetCrashpadInfo() { |
+ return &g_crashpad_info; |
+} |
+ |
+CrashpadInfo::CrashpadInfo() |
+ : signature_(kSignature), |
+ size_(sizeof(*this)), |
+ version_(kCrashpadInfoVersion), |
+ padding_0_(0), |
+ simple_annotations_(nullptr) { |
+} |
+ |
+const uint32_t CrashpadInfo::kSignature; |
+ |
+} // namespace crashpad |