authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-05 14:49:01-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-05 14:49:01-07:00
logdb3b517639db2f4abd3b06a249e95a5e18599126
treead0ca7cf585ebadc106bd31b21e543b4d43c981e
parentff5673ae1b74b8ad59ee23921e0bb4e25349d10f
parent2ee80858b42796c931fb2fe0b45e0ebb6f8ffb30

Merge branch 'realazthat-nonnull-branch'


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 }
28802881
2881 // set parameter attributes2882 // 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, add2907 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 // TODO2910 // 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}
142142
143void 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
143LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type,153LLVMZigDIType *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
39LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args,39LLVMValueRef LLVMZigBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args,
40 unsigned NumArgs, unsigned CC, const char *Name);40 unsigned NumArgs, unsigned CC, const char *Name);
4141
42// 0 is return value, 1 is first arg
43void LLVMZigAddNonNullAttr(LLVMValueRef fn, unsigned i);
4244
43LLVMZigDIType *LLVMZigCreateDebugPointerType(LLVMZigDIBuilder *dibuilder, LLVMZigDIType *pointee_type,45LLVMZigDIType *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);