authorgravatar for lgustaf1@binghamton.eduLayne Gustafson <lgustaf1@binghamton.edu> 2020-01-16 15:26:53-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-01-19 20:53:20-05:00
log35c681b7b18df1f8679457975f9dcfc6a4a53468
tree0a6826b835a11f0947ef67a9fd2004df6c8f0c7f
parent8902f3ca32c22656e1f11b562dc3ad6030da14ac
signature Commit is signed but in an unrecognized format.

Fix sentinel mismatch in llvm strings

Previously, buffers were used with toOwnedSlice() to create c strings for LLVM cpu/feature strings. However, toOwnedSlice() shrinks the string memory to the buffer's length, which cuts off the null terminator. Now toSliceConst() is used instead, and the buffer is not deinited so that the string memory is not freed.

1 files changed, 5 insertions(+), 10 deletions(-)

src-self-hosted/stage1.zig+5-10
......@@ -643,20 +643,20 @@ const Stage2TargetDetails = struct {
643643 var builtin_str_buffer = try std.Buffer.init(
644644 allocator,
645645 "@import(\"std\").target.TargetDetails{.cpu=&@import(\"std\").target.");
646 defer builtin_str_buffer.deinit();
647646
648647 try builtin_str_buffer.append(@tagName(arch));
649648 try builtin_str_buffer.append(".cpu_");
650649 try builtin_str_buffer.append(cpu.name);
651650 try builtin_str_buffer.append("};");
651
652652 return Self{
653653 .allocator = allocator,
654654 .target_details = .{
655655 .cpu = cpu,
656656 },
657 .llvm_cpu_str = try toNullTerminatedStringAlloc(allocator, cpu.name),
657 .llvm_cpu_str = try toNullTerminatedStringAlloc(allocator, cpu.llvm_name),
658658 .llvm_features_str = null_terminated_empty_string,
659 .builtin_str = builtin_str_buffer.toOwnedSlice(),
659 .builtin_str = builtin_str_buffer.toSliceConst(),
660660 };
661661 }
662662
......@@ -664,10 +664,8 @@ const Stage2TargetDetails = struct {
664664 var builtin_str_buffer = try std.Buffer.init(
665665 allocator,
666666 "@import(\"std\").target.TargetDetails{.features=&[_]*const @import(\"std\").target.Feature{\n");
667 defer builtin_str_buffer.deinit();
668667
669668 var llvm_features_buffer = try std.Buffer.initSize(allocator, 0);
670 defer llvm_features_buffer.deinit();
671669
672670 // First, disable all features.
673671 // This way, we only get the ones the user requests.
......@@ -691,17 +689,14 @@ const Stage2TargetDetails = struct {
691689
692690 try builtin_str_buffer.append("}};");
693691
694 // This is needed here because llvm_features_buffer.len() is no longer valid after toOwnedSlice().
695 const llvm_features_buffer_len = llvm_features_buffer.len();
696
697692 return Self{
698693 .allocator = allocator,
699694 .target_details = std.target.TargetDetails{
700695 .features = features,
701696 },
702697 .llvm_cpu_str = null_terminated_empty_string,
703 .llvm_features_str = llvm_features_buffer.toOwnedSlice()[0..llvm_features_buffer_len :0],
704 .builtin_str = builtin_str_buffer.toOwnedSlice(),
698 .llvm_features_str = llvm_features_buffer.toSliceConst(),
699 .builtin_str = builtin_str_buffer.toSliceConst(),
705700 };
706701 }
707702};