diff --git a/src/codegen.cpp b/src/codegen.cpp index f4defb8405fa8e4e03ee49a31d224c91e62b9004..2965c8e59345ae40e77bc4ce096200ebd1820070 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -2905,6 +2905,10 @@ static void do_code_gen(CodeGen *g) { 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); } if (is_byval) { // TODO diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index b0e32e8b6b999229d241ebdaea0029d330a11bbc..5749a996d505e75e4d777f332ea9e45f30837b87 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -140,6 +140,16 @@ LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *A return wrap(unwrap(B)->Insert(call_inst)); } +void LLVMZigAddNonNullAttr(LLVMValueRef fn, unsigned i) +{ + assert( isa(unwrap(fn)) ); + + Function *unwrapped_function = reinterpret_cast(unwrap(fn)); + + unwrapped_function->addAttribute(i, Attribute::NonNull); +} + + LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, uint64_t size_in_bits, uint64_t align_in_bits, const char *name) { diff --git a/src/zig_llvm.hpp b/src/zig_llvm.hpp index 74b2499276158a80847edcbb3ac2499267eb3b36..d4e3548b70f5a9f22960a9cacba314b5cc88b63f 100644 --- a/src/zig_llvm.hpp +++ b/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); +void LLVMZigAddNonNullAttr(LLVMValueRef fn, unsigned i); LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, uint64_t size_in_bits, uint64_t align_in_bits, const char *name);