diff options
Diffstat (limited to 'kernel/gcov/clang.c')
| -rw-r--r-- | kernel/gcov/clang.c | 31 | 
1 files changed, 20 insertions, 11 deletions
diff --git a/kernel/gcov/clang.c b/kernel/gcov/clang.c index 8743150db2ac..b81f2823630d 100644 --- a/kernel/gcov/clang.c +++ b/kernel/gcov/clang.c @@ -70,7 +70,9 @@ struct gcov_fn_info {  	u32 ident;  	u32 checksum; +#if CONFIG_CLANG_VERSION < 110000  	u8 use_extra_checksum; +#endif  	u32 cfg_checksum;  	u32 num_counters; @@ -145,10 +147,8 @@ void llvm_gcda_emit_function(u32 ident, const char *function_name,  	list_add_tail(&info->head, ¤t_info->functions);  } -EXPORT_SYMBOL(llvm_gcda_emit_function);  #else -void llvm_gcda_emit_function(u32 ident, u32 func_checksum, -		u8 use_extra_checksum, u32 cfg_checksum) +void llvm_gcda_emit_function(u32 ident, u32 func_checksum, u32 cfg_checksum)  {  	struct gcov_fn_info *info = kzalloc(sizeof(*info), GFP_KERNEL); @@ -158,12 +158,11 @@ void llvm_gcda_emit_function(u32 ident, u32 func_checksum,  	INIT_LIST_HEAD(&info->head);  	info->ident = ident;  	info->checksum = func_checksum; -	info->use_extra_checksum = use_extra_checksum;  	info->cfg_checksum = cfg_checksum;  	list_add_tail(&info->head, ¤t_info->functions);  } -EXPORT_SYMBOL(llvm_gcda_emit_function);  #endif +EXPORT_SYMBOL(llvm_gcda_emit_function);  void llvm_gcda_emit_arcs(u32 num_counters, u64 *counters)  { @@ -293,11 +292,16 @@ int gcov_info_is_compatible(struct gcov_info *info1, struct gcov_info *info2)  		!list_is_last(&fn_ptr2->head, &info2->functions)) {  		if (fn_ptr1->checksum != fn_ptr2->checksum)  			return false; +#if CONFIG_CLANG_VERSION < 110000  		if (fn_ptr1->use_extra_checksum != fn_ptr2->use_extra_checksum)  			return false;  		if (fn_ptr1->use_extra_checksum &&  			fn_ptr1->cfg_checksum != fn_ptr2->cfg_checksum)  			return false; +#else +		if (fn_ptr1->cfg_checksum != fn_ptr2->cfg_checksum) +			return false; +#endif  		fn_ptr1 = list_next_entry(fn_ptr1, head);  		fn_ptr2 = list_next_entry(fn_ptr2, head);  	} @@ -365,7 +369,7 @@ static struct gcov_fn_info *gcov_fn_info_dup(struct gcov_fn_info *fn)  	INIT_LIST_HEAD(&fn_dup->head);  	cv_size = fn->num_counters * sizeof(fn->counters[0]); -	fn_dup->counters = vmalloc(cv_size); +	fn_dup->counters = kvmalloc(cv_size, GFP_KERNEL);  	if (!fn_dup->counters) {  		kfree(fn_dup);  		return NULL; @@ -529,17 +533,22 @@ static size_t convert_to_gcda(char *buffer, struct gcov_info *info)  	list_for_each_entry(fi_ptr, &info->functions, head) {  		u32 i; -		u32 len = 2; - -		if (fi_ptr->use_extra_checksum) -			len++;  		pos += store_gcov_u32(buffer, pos, GCOV_TAG_FUNCTION); -		pos += store_gcov_u32(buffer, pos, len); +#if CONFIG_CLANG_VERSION < 110000 +		pos += store_gcov_u32(buffer, pos, +			fi_ptr->use_extra_checksum ? 3 : 2); +#else +		pos += store_gcov_u32(buffer, pos, 3); +#endif  		pos += store_gcov_u32(buffer, pos, fi_ptr->ident);  		pos += store_gcov_u32(buffer, pos, fi_ptr->checksum); +#if CONFIG_CLANG_VERSION < 110000  		if (fi_ptr->use_extra_checksum)  			pos += store_gcov_u32(buffer, pos, fi_ptr->cfg_checksum); +#else +		pos += store_gcov_u32(buffer, pos, fi_ptr->cfg_checksum); +#endif  		pos += store_gcov_u32(buffer, pos, GCOV_TAG_COUNTER_BASE);  		pos += store_gcov_u32(buffer, pos, fi_ptr->num_counters * 2);  | 
