Commit 2ee80858b4

Andrew Kelley <superjoe30@gmail.com>
2016-02-05 22:48:23
codegen: use gen_index for nonnull attribute
also put nonnull on sret params closes #82
1 parent 54fbe75
Changed files (2)
src/codegen.cpp
@@ -2876,6 +2876,7 @@ static void do_code_gen(CodeGen *g) {
         if (handle_is_ptr(fn_type->data.fn.fn_type_id.return_type)) {
             LLVMValueRef first_arg = LLVMGetParam(fn_table_entry->fn_value, 0);
             LLVMAddAttribute(first_arg, LLVMStructRetAttribute);
+            LLVMZigAddNonNullAttr(fn_table_entry->fn_value, 1);
         }
 
         // set parameter attributes
@@ -2903,12 +2904,7 @@ static void do_code_gen(CodeGen *g) {
                 LLVMAddAttribute(argument_val, LLVMReadOnlyAttribute);
             }
             if (param_type->id == TypeTableEntryIdPointer) {
-                // when https://github.com/andrewrk/zig/issues/82 is fixed, add
-                // non null attribute here
-
-                ///`i` is arg index + 1
-                ///I think that 0 is the return index, but it has a named LLVM constant variable
-                LLVMZigAddNonNullAttr(fn_table_entry->fn_value, param_decl_i + 1);
+                LLVMZigAddNonNullAttr(fn_table_entry->fn_value, gen_index + 1);
             }
             if (is_byval) {
                 // TODO
src/zig_llvm.hpp
@@ -39,6 +39,7 @@ void LLVMZigOptimizeModule(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef
 LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args,
         unsigned NumArgs, unsigned CC, const char *Name);
 
+// 0 is return value, 1 is first arg
 void LLVMZigAddNonNullAttr(LLVMValueRef fn, unsigned i);
 
 LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type,