OLD | NEW |
---|---|
1 // Copyright (c) 2012, Google Inc. | 1 // Copyright (c) 2012, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 12 matching lines...) Expand all Loading... | |
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 | 29 |
30 #include "common/mac/arch_utilities.h" | 30 #include "common/mac/arch_utilities.h" |
31 | 31 |
32 #include <mach-o/arch.h> | 32 #include <mach-o/arch.h> |
33 #include <mach-o/fat.h> | |
33 #include <stdio.h> | 34 #include <stdio.h> |
34 #include <string.h> | 35 #include <string.h> |
35 | 36 |
36 #ifndef CPU_TYPE_ARM | 37 #ifndef CPU_TYPE_ARM |
Mark Mentovai
2015/09/11 15:49:50
I don’t think we need backup definitions of CPU_TY
Ted Mielczarek
2015/09/15 12:58:36
Done.
| |
37 #define CPU_TYPE_ARM (static_cast<cpu_type_t>(12)) | 38 #define CPU_TYPE_ARM (static_cast<cpu_type_t>(12)) |
38 #endif // CPU_TYPE_ARM | 39 #endif // CPU_TYPE_ARM |
39 | 40 |
40 #ifndef CPU_SUBTYPE_ARM_V7 | 41 #ifndef CPU_SUBTYPE_ARM_V7 |
41 #define CPU_SUBTYPE_ARM_V7 (static_cast<cpu_subtype_t>(9)) | 42 #define CPU_SUBTYPE_ARM_V7 (static_cast<cpu_subtype_t>(9)) |
42 #endif // CPU_SUBTYPE_ARM_V7 | 43 #endif // CPU_SUBTYPE_ARM_V7 |
43 | 44 |
44 #ifndef CPU_SUBTYPE_ARM_V7S | 45 #ifndef CPU_SUBTYPE_ARM_V7S |
45 #define CPU_SUBTYPE_ARM_V7S (static_cast<cpu_subtype_t>(11)) | 46 #define CPU_SUBTYPE_ARM_V7S (static_cast<cpu_subtype_t>(11)) |
46 #endif // CPU_SUBTYPE_ARM_V7S | 47 #endif // CPU_SUBTYPE_ARM_V7S |
47 | 48 |
48 #ifndef CPU_TYPE_ARM64 | 49 #ifndef CPU_TYPE_ARM64 |
49 #define CPU_TYPE_ARM64 (static_cast<cpu_type_t>(16777228)) | 50 #define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) |
50 #endif // CPU_TYPE_ARM64 | 51 #endif // CPU_TYPE_ARM64 |
51 | 52 |
52 #ifndef CPU_SUBTYPE_ARM64_ALL | 53 #ifndef CPU_SUBTYPE_ARM64_ALL |
53 #define CPU_SUBTYPE_ARM64_ALL (static_cast<cpu_type_t>(0)) | 54 #define CPU_SUBTYPE_ARM64_ALL (static_cast<cpu_subtype_t>(0)) |
54 #endif // CPU_SUBTYPE_ARM64_ALL | 55 #endif // CPU_SUBTYPE_ARM64_ALL |
55 | 56 |
56 namespace { | 57 namespace { |
57 | 58 |
58 const NXArchInfo* ArchInfo_arm64() { | 59 const NXArchInfo* ArchInfo_arm64() { |
59 NXArchInfo* arm64 = new NXArchInfo; | 60 NXArchInfo* arm64 = new NXArchInfo; |
60 *arm64 = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM, | 61 *arm64 = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM, |
61 CPU_SUBTYPE_ARM_V7); | 62 CPU_SUBTYPE_ARM_V7); |
62 arm64->name = "arm64"; | 63 arm64->name = "arm64"; |
63 arm64->cputype = CPU_TYPE_ARM64; | 64 arm64->cputype = CPU_TYPE_ARM64; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
104 // TODO: Remove this when the OS knows about armv7s. | 105 // TODO: Remove this when the OS knows about armv7s. |
105 if (cpu_type == CPU_TYPE_ARM && cpu_subtype == CPU_SUBTYPE_ARM_V7S) { | 106 if (cpu_type == CPU_TYPE_ARM && cpu_subtype == CPU_SUBTYPE_ARM_V7S) { |
106 static const NXArchInfo* armv7s = ArchInfo_armv7s(); | 107 static const NXArchInfo* armv7s = ArchInfo_armv7s(); |
107 return armv7s; | 108 return armv7s; |
108 } | 109 } |
109 | 110 |
110 return NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); | 111 return NXGetArchInfoFromCpuType(cpu_type, cpu_subtype); |
111 } | 112 } |
112 | 113 |
113 } // namespace google_breakpad | 114 } // namespace google_breakpad |
115 | |
116 #ifndef __APPLE__ | |
Mark Mentovai
2015/09/11 15:49:50
Did this code come from anywhere else or did you w
Ted Mielczarek
2015/09/11 15:58:00
I wrote it myself after I noticed the existing pol
Ted Mielczarek
2015/09/15 12:58:36
Acknowledged.
| |
117 namespace { | |
118 | |
119 enum Architecture { | |
120 kArch_i386 = 0, | |
121 kArch_x86_64, | |
122 kArch_arm, | |
123 kArch_arm64, | |
124 kArch_ppc, | |
125 // This must be last. | |
126 kNumArchitectures | |
127 }; | |
128 | |
129 const NXArchInfo kKnownArchitectures[] = { | |
Mark Mentovai
2015/09/11 15:49:50
Comment that Architecture and kKnownArchitectures[
Ted Mielczarek
2015/09/15 12:58:36
Done.
| |
130 { | |
131 "i386", | |
132 CPU_TYPE_I386, | |
133 CPU_SUBTYPE_I386_ALL, | |
134 NX_LittleEndian, | |
135 "Intel 80x86" | |
136 }, | |
137 { | |
138 "x86_64", | |
139 CPU_TYPE_X86_64, | |
140 CPU_SUBTYPE_X86_64_ALL, | |
141 NX_LittleEndian, | |
142 "Intel x86-64" | |
143 }, | |
144 { | |
145 "arm", | |
146 CPU_TYPE_ARM, | |
147 CPU_SUBTYPE_ARM_ALL, | |
148 NX_LittleEndian, | |
149 "ARM" | |
150 }, | |
151 { | |
152 "arm64", | |
153 CPU_TYPE_ARM64, | |
154 CPU_SUBTYPE_ARM64_ALL, | |
155 NX_LittleEndian, | |
156 "ARM64" | |
157 }, | |
158 { | |
159 "ppc", | |
160 CPU_TYPE_POWERPC, | |
161 CPU_SUBTYPE_POWERPC_ALL, | |
162 NX_BigEndian, | |
163 "PowerPC" | |
164 } | |
165 }; | |
166 | |
167 } // namespace | |
168 | |
169 const NXArchInfo *NXGetLocalArchInfo(void) { | |
170 Architecture arch; | |
171 #if defined(__i386__) | |
172 arch = kArch_i386; | |
173 #elif defined(__x86_64__) | |
174 arch = kArch_x86_64; | |
175 #elif defined(__arm64) | |
176 arch = kArch_arm64; | |
177 #elif defined(__arm__) | |
178 arch = kArch_arm; | |
179 #elif defined(__powerpc__) | |
180 arch = kArch_ppc; | |
181 #else | |
182 #error "Unsupported CPU architecture" | |
183 #endif | |
184 return &kKnownArchitectures[arch]; | |
185 } | |
186 | |
187 const NXArchInfo *NXGetArchInfoFromName(const char *name) { | |
188 for (int arch = 0; arch < kNumArchitectures; ++arch) { | |
189 if (strcmp(name, kKnownArchitectures[arch].name)) { | |
190 return &kKnownArchitectures[arch]; | |
191 } | |
192 } | |
193 return nullptr; | |
194 } | |
195 | |
196 const NXArchInfo *NXGetArchInfoFromCpuType(cpu_type_t cputype, | |
197 cpu_subtype_t cpusubtype) { | |
198 for (int arch = 0; arch < kNumArchitectures; ++arch) { | |
199 if (kKnownArchitectures[arch].cputype == cputype) { | |
200 return &kKnownArchitectures[arch]; | |
201 } | |
202 } | |
203 return nullptr; | |
204 } | |
205 | |
206 struct fat_arch *NXFindBestFatArch(cpu_type_t cputype, | |
207 cpu_subtype_t cpusubtype, | |
208 struct fat_arch *fat_archs, | |
209 uint32_t nfat_archs) { | |
210 for (uint32_t f = 0; f < nfat_archs; ++f) { | |
211 if (fat_archs[f].cputype == cputype) { | |
212 return &fat_archs[f]; | |
213 } | |
214 } | |
215 return nullptr; | |
216 } | |
217 #endif // !__APPLE__ | |
OLD | NEW |