| 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 | 2876 | if (handle_is_ptr(fn_type->data.fn.fn_type_id.return_type)) { |
| 2877 | 2877 | LLVMValueRef first_arg = LLVMGetParam(fn_table_entry->fn_value, 0); |
| 2878 | 2878 | LLVMAddAttribute(first_arg, LLVMStructRetAttribute); |
| 2879 | LLVMZigAddNonNullAttr(fn_table_entry->fn_value, 1); | |
| 2879 | 2880 | } |
| 2880 | 2881 | |
| 2881 | 2882 | // set parameter attributes |
| ... | ... | @@ -2903,8 +2904,7 @@ static void do_code_gen(CodeGen *g) { |
| 2903 | 2904 | LLVMAddAttribute(argument_val, LLVMReadOnlyAttribute); |
| 2904 | 2905 | } |
| 2905 | 2906 | if (param_type->id == TypeTableEntryIdPointer) { |
| 2906 | // when https://github.com/andrewrk/zig/issues/82 is fixed, add | |
| 2907 | // non null attribute here | |
| 2907 | LLVMZigAddNonNullAttr(fn_table_entry->fn_value, gen_index + 1); | |
| 2908 | 2908 | } |
| 2909 | 2909 | if (is_byval) { |
| 2910 | 2910 | // TODO |
src/zig_llvm.cpp+10| ... | ... | @@ -140,6 +140,16 @@ LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *A |
| 140 | 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 | 153 | LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, |
| 144 | 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 | 39 | LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args, |
| 40 | 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 | 45 | LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type, |
| 44 | 46 | uint64_t size_in_bits, uint64_t align_in_bits, const char *name); |