authorgravatar for justin.b.alexander1@gmail.comvegecode <justin.b.alexander1@gmail.com> 2019-04-07 22:17:21-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-10 12:35:16-04:00
logaff2e47821aaad5cac74ed8a3cac2e72283b594b
treea34d36b0b6a4e628a5be0bb883e03607bf877194
parentdea1027f9799e6ce0f7f2594c6b555d9675c281a

compiler-rt: correct use_thumb_1 flag

The flag is for generating correct arm-thumb interwork veneers in the assembly code __aeabi_{memcpy,memset,etc} functions. Armv6m only does thumb code generation regardless of whether arm or thumb is selected and armv6t2 uses the newer thumb 2 set. All other versions that zig supports pre-armv7 need the veneers and hence the flag. Armv5 is actually armv5t. Relevant code from clang/lib/Basic/Targets/Arm.cpp ```c bool ARMTargetInfo::isThumb() const { return ArchISA == llvm::ARM::ISAKind::THUMB; } bool ARMTargetInfo::supportsThumb() const { return CPUAttr.count('T') || ArchVersion >= 6; } bool ARMTargetInfo::supportsThumb2() const { return CPUAttr.equals("6T2") || (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE")); } ``` Also see http://www.llvm.org/svn/llvm-project/llvm/trunk/lib/Target/ARM/ARM.td

1 files changed, 69 insertions(+), 8 deletions(-)

std/special/compiler_rt.zig+69-8
...@@ -253,14 +253,75 @@ const is_arm_arch = switch (builtin.arch) {...@@ -253,14 +253,75 @@ const is_arm_arch = switch (builtin.arch) {
253253
254const is_arm_32 = is_arm_arch and !is_arm_64;254const is_arm_32 = is_arm_arch and !is_arm_64;
255255
256const use_thumb_1 = is_arm_32 and switch (builtin.arch.arm) {256const use_thumb_1 = usesThumb1(builtin.arch);
257 builtin.Arch.Arm32.v6,257
258 builtin.Arch.Arm32.v6m,258fn usesThumb1(arch: builtin.Arch) bool {
259 builtin.Arch.Arm32.v6k,259 return switch (arch) {
260 builtin.Arch.Arm32.v6t2,260 .arm => switch (arch.arm) {
261 => true,261 .v6m => true,
262 else => false,262 else => false,
263};263 },
264 .armeb => switch (arch.armeb) {
265 .v6m => true,
266 else => false,
267 },
268 .thumb => switch (arch.thumb) {
269 .v5,
270 .v5te,
271 .v4t,
272 .v6,
273 .v6m,
274 .v6k,
275 => true,
276 else => false,
277 },
278 .thumbeb => switch (arch.thumbeb) {
279 .v5,
280 .v5te,
281 .v4t,
282 .v6,
283 .v6m,
284 .v6k,
285 => true,
286 else => false,
287 },
288 else => false,
289 };
290}
291
292test "usesThumb1" {
293 testing.expect(usesThumb1(builtin.Arch{ .arm = .v6m }));
294 testing.expect(!usesThumb1(builtin.Arch{ .arm = .v5 }));
295 //etc.
296
297 testing.expect(usesThumb1(builtin.Arch{ .armeb = .v6m }));
298 testing.expect(!usesThumb1(builtin.Arch{ .armeb = .v5 }));
299 //etc.
300
301 testing.expect(usesThumb1(builtin.Arch{ .thumb = .v5 }));
302 testing.expect(usesThumb1(builtin.Arch{ .thumb = .v5te }));
303 testing.expect(usesThumb1(builtin.Arch{ .thumb = .v4t }));
304 testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6 }));
305 testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6k }));
306 testing.expect(usesThumb1(builtin.Arch{ .thumb = .v6m }));
307 testing.expect(!usesThumb1(builtin.Arch{ .thumb = .v6t2 }));
308 //etc.
309
310 testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v5 }));
311 testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v5te }));
312 testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v4t }));
313 testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6 }));
314 testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6k }));
315 testing.expect(usesThumb1(builtin.Arch{ .thumbeb = .v6m }));
316 testing.expect(!usesThumb1(builtin.Arch{ .thumbeb = .v6t2 }));
317 //etc.
318
319 testing.expect(!usesThumb1(builtin.Arch{ .aarch64 = .v8 }));
320 testing.expect(!usesThumb1(builtin.Arch{ .aarch64_be = .v8 }));
321 testing.expect(!usesThumb1(builtin.Arch.x86_64));
322 testing.expect(!usesThumb1(builtin.Arch.riscv32));
323 //etc.
324}
264325
265nakedcc fn __aeabi_uidivmod() void {326nakedcc fn __aeabi_uidivmod() void {
266 @setRuntimeSafety(false);327 @setRuntimeSafety(false);