| author | |
| committer | |
| log | db3b517639db2f4abd3b06a249e95a5e18599126 |
| tree | ad0ca7cf585ebadc106bd31b21e543b4d43c981e |
| parent | ff5673ae1b74b8ad59ee23921e0bb4e25349d10f |
| parent | 2ee80858b42796c931fb2fe0b45e0ebb6f8ffb30 |
3 files changed, 14 insertions(+), 2 deletions(-)
src/codegen.cpp+2-2| ... | @@ -2876,6 +2876,7 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -2876,6 +2876,7 @@ static void do_code_gen(CodeGen *g) { |
| 2876 | if (handle_is_ptr(fn_type->data.fn.fn_type_id.return_type)) { | 2876 | if (handle_is_ptr(fn_type->data.fn.fn_type_id.return_type)) { |
| 2877 | LLVMValueRef first_arg = LLVMGetParam(fn_table_entry->fn_value, 0); | 2877 | LLVMValueRef first_arg = LLVMGetParam(fn_table_entry->fn_value, 0); |
| 2878 | LLVMAddAttribute(first_arg, LLVMStructRetAttribute); | 2878 | LLVMAddAttribute(first_arg, LLVMStructRetAttribute); |
| 2879 | LLVMZigAddNonNullAttr(fn_table_entry->fn_value, 1); | ||
| 2879 | } | 2880 | } |
| 2880 | 2881 | ||
| 2881 | // set parameter attributes | 2882 | // set parameter attributes |
| ... | @@ -2903,8 +2904,7 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -2903,8 +2904,7 @@ static void do_code_gen(CodeGen *g) { |
| 2903 | LLVMAddAttribute(argument_val, LLVMReadOnlyAttribute); | 2904 | LLVMAddAttribute(argument_val, LLVMReadOnlyAttribute); |
| 2904 | } | 2905 | } |
| 2905 | if (param_type->id == TypeTableEntryIdPointer) { | 2906 | if (param_type->id == TypeTableEntryIdPointer) { |
| 2906 | // when https://github.com/andrewrk/zig/issues/82 is fixed, add | 2907 | LLVMZigAddNonNullAttr(fn_table_entry->fn_value, gen_index + 1); |
| 2907 | // non null attribute here | ||
| 2908 | } | 2908 | } |
| 2909 | if (is_byval) { | 2909 | if (is_byval) { |
| 2910 | // TODO | 2910 | // TODO |
src/zig_llvm.cpp+10| ... | @@ -140,6 +140,16 @@ LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *A | ... | @@ -140,6 +140,16 @@ LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *A |
| 140 | return wrap(unwrap(B)->Insert(call_inst)); | 140 | return wrap(unwrap(B)->Insert(call_inst)); |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | void LLVMZigAddNonNullAttr(LLVMValueRef fn, unsigned i) | ||
| 144 | { | ||
| 145 | assert( isa<Function>(unwrap(fn)) ); | ||
| 146 | |||
| 147 | Function *unwrapped_function = reinterpret_cast<Function*>(unwrap(fn)); | ||
| 148 | |||
| 149 | unwrapped_function->addAttribute(i, Attribute::NonNull); | ||
| 150 | } | ||
| 151 | |||
| 152 | |||
| 143 | LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, | 153 | LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, |
| 144 | uint64_t size_in_bits, uint64_t align_in_bits, const char *name) | 154 | uint64_t size_in_bits, uint64_t align_in_bits, const char *name) |
| 145 | { | 155 | { |
src/zig_llvm.hpp+2| ... | @@ -39,6 +39,8 @@ void LLVMZigOptimizeModule(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef | ... | @@ -39,6 +39,8 @@ void LLVMZigOptimizeModule(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef |
| 39 | LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args, | 39 | LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args, |
| 40 | unsigned NumArgs, unsigned CC, const char *Name); | 40 | unsigned NumArgs, unsigned CC, const char *Name); |
| 41 | 41 | ||
| 42 | // 0 is return value, 1 is first arg | ||
| 43 | void LLVMZigAddNonNullAttr(LLVMValueRef fn, unsigned i); | ||
| 42 | 44 | ||
| 43 | LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, | 45 | LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, |
| 44 | uint64_t size_in_bits, uint64_t align_in_bits, const char *name); | 46 | uint64_t size_in_bits, uint64_t align_in_bits, const char *name); |