stage1: Apply the same set of fn attributes everywhere

Make sure to propagate the target-specific attributes to internal
functions too.

Closes #8965
This commit is contained in:
LemonBoy 2021-06-05 21:24:30 +02:00 committed by Andrew Kelley
parent ca6951ff79
commit 849b4e3495

View File

@ -364,6 +364,29 @@ static bool codegen_have_frame_pointer(CodeGen *g) {
return g->build_mode == BuildModeDebug;
}
static void add_common_fn_attributes(CodeGen *g, LLVMValueRef llvm_fn) {
if (!g->red_zone) {
addLLVMFnAttr(llvm_fn, "noredzone");
}
addLLVMFnAttr(llvm_fn, "nounwind");
add_uwtable_attr(g, llvm_fn);
addLLVMFnAttr(llvm_fn, "nobuiltin");
if (g->build_mode == BuildModeSmallRelease) {
// Optimize for small code size.
addLLVMFnAttr(llvm_fn, "minsize");
addLLVMFnAttr(llvm_fn, "optsize");
}
if (g->zig_target->llvm_cpu_name != nullptr) {
ZigLLVMAddFunctionAttr(llvm_fn, "target-cpu", g->zig_target->llvm_cpu_name);
}
if (g->zig_target->llvm_cpu_features != nullptr) {
ZigLLVMAddFunctionAttr(llvm_fn, "target-features", g->zig_target->llvm_cpu_features);
}
}
static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
const char *unmangled_name = buf_ptr(&fn->symbol_name);
const char *symbol_name;
@ -556,23 +579,10 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
maybe_import_dll(g, llvm_fn, linkage);
}
if (!g->red_zone) {
addLLVMFnAttr(llvm_fn, "noredzone");
}
if (fn->alignstack_value != 0) {
addLLVMFnAttrInt(llvm_fn, "alignstack", fn->alignstack_value);
}
if (g->build_mode == BuildModeSmallRelease) {
// Optimize for small code size.
addLLVMFnAttr(llvm_fn, "minsize");
addLLVMFnAttr(llvm_fn, "optsize");
}
addLLVMFnAttr(llvm_fn, "nounwind");
add_uwtable_attr(g, llvm_fn);
addLLVMFnAttr(llvm_fn, "nobuiltin");
if (codegen_have_frame_pointer(g) && cc != CallingConventionInline) {
ZigLLVMAddFunctionAttr(llvm_fn, "frame-pointer", "all");
}
@ -588,12 +598,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
// use the ABI alignment, which is fine.
}
if (g->zig_target->llvm_cpu_name != nullptr) {
ZigLLVMAddFunctionAttr(llvm_fn, "target-cpu", g->zig_target->llvm_cpu_name);
}
if (g->zig_target->llvm_cpu_features != nullptr) {
ZigLLVMAddFunctionAttr(llvm_fn, "target-features", g->zig_target->llvm_cpu_features);
}
add_common_fn_attributes(g, llvm_fn);
if (is_async) {
addLLVMArgAttr(llvm_fn, 0, "nonnull");
@ -1183,8 +1188,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
addLLVMFnAttr(fn_val, "alwaysinline");
LLVMSetLinkage(fn_val, LLVMInternalLinkage);
ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
addLLVMFnAttr(fn_val, "nounwind");
add_uwtable_attr(g, fn_val);
add_common_fn_attributes(g, fn_val);
// Error return trace memory is in the stack, which is impossible to be at address 0
// on any architecture.
addLLVMArgAttr(fn_val, (unsigned)0, "nonnull");
@ -1263,8 +1267,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) {
addLLVMFnAttr(fn_val, "cold");
LLVMSetLinkage(fn_val, LLVMInternalLinkage);
ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
addLLVMFnAttr(fn_val, "nounwind");
add_uwtable_attr(g, fn_val);
add_common_fn_attributes(g, fn_val);
if (codegen_have_frame_pointer(g)) {
ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all");
}
@ -1346,8 +1349,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
addLLVMFnAttr(fn_val, "cold");
LLVMSetLinkage(fn_val, LLVMInternalLinkage);
ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
addLLVMFnAttr(fn_val, "nounwind");
add_uwtable_attr(g, fn_val);
add_common_fn_attributes(g, fn_val);
if (codegen_have_frame_pointer(g)) {
ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all");
}
@ -2322,8 +2324,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {
LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
LLVMSetLinkage(fn_val, LLVMInternalLinkage);
ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
addLLVMFnAttr(fn_val, "nounwind");
add_uwtable_attr(g, fn_val);
add_common_fn_attributes(g, fn_val);
addLLVMArgAttr(fn_val, (unsigned)0, "noalias");
addLLVMArgAttr(fn_val, (unsigned)0, "writeonly");
@ -5266,8 +5267,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {
LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
LLVMSetLinkage(fn_val, LLVMInternalLinkage);
ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
addLLVMFnAttr(fn_val, "nounwind");
add_uwtable_attr(g, fn_val);
add_common_fn_attributes(g, fn_val);
if (codegen_have_frame_pointer(g)) {
ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all");
}