authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-31 20:25:13-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-05-31 20:25:13-04:00
log602af1b88f150f8b09d980520620ab289c425075
treee58d2c339375c44e7b12b3bc1b86dfd9ca7b7249
parent6d691d3540b1979f0a8d604922c93209b9c0dba0
parentec919c3c9b915ea0795c24f07c3014915ca0038a
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11765 from ziglang/llvm-param-attrs

LLVM: add readonly, nonnull, align attributes to pointer params

1 files changed, 26 insertions(+), 13 deletions(-)

src/codegen/llvm.zig+26-13
......@@ -712,7 +712,6 @@ pub const Object = struct {
712712 .byval => {
713713 const param_ty = fn_info.param_types[it.zig_index - 1];
714714 const param = llvm_func.getParam(llvm_arg_i);
715 llvm_arg_i += 1;
716715
717716 if (isByRef(param_ty)) {
718717 const alignment = param_ty.abiAlignment(target);
......@@ -724,11 +723,33 @@ pub const Object = struct {
724723 try args.append(arg_ptr);
725724 } else {
726725 try args.append(param);
726
727 if (param_ty.isPtrAtRuntime()) {
728 // TODO noalias attribute
729 const ptr_info = param_ty.ptrInfo().data;
730 if (!param_ty.isPtrLikeOptional() and !ptr_info.@"allowzero") {
731 dg.addArgAttr(llvm_func, llvm_arg_i, "nonnull");
732 }
733 if (!ptr_info.mutable) {
734 dg.addArgAttr(llvm_func, llvm_arg_i, "readonly");
735 }
736 if (ptr_info.@"align" != 0) {
737 dg.addArgAttrInt(llvm_func, llvm_arg_i, "align", ptr_info.@"align");
738 } else {
739 dg.addArgAttrInt(llvm_func, llvm_arg_i, "align", ptr_info.pointee_type.abiAlignment(target));
740 }
741 }
727742 }
743 llvm_arg_i += 1;
728744 },
729745 .byref => {
730746 const param_ty = fn_info.param_types[it.zig_index - 1];
731747 const param = llvm_func.getParam(llvm_arg_i);
748
749 dg.addArgAttr(llvm_func, llvm_arg_i, "nonnull");
750 dg.addArgAttr(llvm_func, llvm_arg_i, "readonly");
751 dg.addArgAttrInt(llvm_func, llvm_arg_i, "align", param_ty.abiAlignment(target));
752
732753 llvm_arg_i += 1;
733754
734755 if (isByRef(param_ty)) {
......@@ -2213,20 +2234,8 @@ pub const DeclGen = struct {
22132234 dg.addArgAttr(llvm_fn, @boolToInt(sret), "nonnull");
22142235 }
22152236
2216 // Set parameter attributes.
2217 // TODO: more attributes. see codegen.cpp `make_fn_llvm_value`.
22182237 switch (fn_info.cc) {
22192238 .Unspecified, .Inline => {
2220 var llvm_param_i: c_uint = @as(c_uint, @boolToInt(sret)) + @boolToInt(err_return_tracing);
2221 for (fn_info.param_types) |param_ty| {
2222 if (!param_ty.hasRuntimeBitsIgnoreComptime()) continue;
2223
2224 if (isByRef(param_ty)) {
2225 dg.addArgAttr(llvm_fn, llvm_param_i, "nonnull");
2226 // TODO readonly, noalias, align
2227 }
2228 llvm_param_i += 1;
2229 }
22302239 llvm_fn.setFunctionCallConv(.Fast);
22312240 },
22322241 .Naked => {
......@@ -3705,6 +3714,10 @@ pub const DeclGen = struct {
37053714 return dg.addAttr(fn_val, param_index + 1, attr_name);
37063715 }
37073716
3717 fn addArgAttrInt(dg: DeclGen, fn_val: *const llvm.Value, param_index: u32, attr_name: []const u8, int: u64) void {
3718 return dg.addAttrInt(fn_val, param_index + 1, attr_name, int);
3719 }
3720
37083721 fn removeAttr(val: *const llvm.Value, index: llvm.AttributeIndex, name: []const u8) void {
37093722 const kind_id = llvm.getEnumAttributeKindForName(name.ptr, name.len);
37103723 assert(kind_id != 0);