arch/loongarch/Kconfig | 5 ++++- arch/loongarch/Kconfig.debug | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
GAS <= 2.41 does not support generating R_LARCH_{32,64}_PCREL for
"label - ." and it generates R_LARCH_{ADD,SUB}{32,64} pairs instead.
objtool cannot handle R_LARCH_{ADD,SUB}{32,64} pair in __jump_table
(static key implementation) and etc. so it will produce some warnings.
This is causing the kernel CI systems to complain everywhere.
For GAS we can check if -mthin-add-sub option is available to know if
R_LARCH_{32,64}_PCREL are supported.
For Clang, we require Clang >= 18 and Clang >= 17 already supports
R_LARCH_{32,64}_PCREL, so we can always assume Clang is fine for
objtool.
Note that __jump_table is not generated by the compiler so
-fno-jump-table is completely irrelevant for this issue.
Fixes: cb8a2ef0848c ("LoongArch: Add ORC stack unwinder support")
Closes: https://lore.kernel.org/loongarch/Zl5m1ZlVmGKitAof@yujie-X299/
Closes: https://lore.kernel.org/loongarch/ZlY1gDDPi_mNrwJ1@slm.duckdns.org/
Closes: https://lore.kernel.org/loongarch/1717478006.038663-1-hengqi@linux.alibaba.com/
Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=816029e06768
Link: https://github.com/llvm/llvm-project/commit/42cb3c6346fc
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
arch/loongarch/Kconfig | 5 ++++-
arch/loongarch/Kconfig.debug | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
index e38139c576ee..e461a6c59f15 100644
--- a/arch/loongarch/Kconfig
+++ b/arch/loongarch/Kconfig
@@ -143,7 +143,7 @@ config LOONGARCH
select HAVE_LIVEPATCH
select HAVE_MOD_ARCH_SPECIFIC
select HAVE_NMI
- select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS
+ select HAVE_OBJTOOL if AS_HAS_EXPLICIT_RELOCS && AS_HAS_THIN_ADD_SUB
select HAVE_PCI
select HAVE_PERF_EVENTS
select HAVE_PERF_REGS
@@ -273,6 +273,9 @@ config AS_HAS_LBT_EXTENSION
config AS_HAS_LVZ_EXTENSION
def_bool $(as-instr,hvcl 0)
+config AS_HAS_THIN_ADD_SUB
+ def_bool $(cc-option,-Wa$(comma)-mthin-add-sub) || CC_IS_CLANG
+
menu "Kernel type and options"
source "kernel/Kconfig.hz"
diff --git a/arch/loongarch/Kconfig.debug b/arch/loongarch/Kconfig.debug
index 98d60630c3d4..8b2ce5b5d43e 100644
--- a/arch/loongarch/Kconfig.debug
+++ b/arch/loongarch/Kconfig.debug
@@ -28,6 +28,7 @@ config UNWINDER_PROLOGUE
config UNWINDER_ORC
bool "ORC unwinder"
+ depends on HAVE_OBJTOOL
select OBJTOOL
help
This option enables the ORC (Oops Rewind Capability) unwinder for
--
2.45.2
On Tue, Jun 04, 2024 at 11:07:41PM +0800, Xi Ruoyao wrote:
> GAS <= 2.41 does not support generating R_LARCH_{32,64}_PCREL for
> "label - ." and it generates R_LARCH_{ADD,SUB}{32,64} pairs instead.
> objtool cannot handle R_LARCH_{ADD,SUB}{32,64} pair in __jump_table
> (static key implementation) and etc. so it will produce some warnings.
> This is causing the kernel CI systems to complain everywhere.
>
> For GAS we can check if -mthin-add-sub option is available to know if
> R_LARCH_{32,64}_PCREL are supported.
>
> For Clang, we require Clang >= 18 and Clang >= 17 already supports
> R_LARCH_{32,64}_PCREL, so we can always assume Clang is fine for
> objtool.
For what it's worth, I have noticed some warnings with clang that I
don't see with GCC but I only filed an issue on our GitHub and never
followed up on the mailing list, so sorry about that.
https://github.com/ClangBuiltLinux/linux/issues/2024
Might be tangential to this patch though but I felt it was worth
mentioning.
Cheers,
Nathan
On Tue, 2024-06-04 at 22:43 -0700, Nathan Chancellor wrote:
> On Tue, Jun 04, 2024 at 11:07:41PM +0800, Xi Ruoyao wrote:
> > GAS <= 2.41 does not support generating R_LARCH_{32,64}_PCREL for
> > "label - ." and it generates R_LARCH_{ADD,SUB}{32,64} pairs instead.
> > objtool cannot handle R_LARCH_{ADD,SUB}{32,64} pair in __jump_table
> > (static key implementation) and etc. so it will produce some warnings.
> > This is causing the kernel CI systems to complain everywhere.
> >
> > For GAS we can check if -mthin-add-sub option is available to know if
> > R_LARCH_{32,64}_PCREL are supported.
> >
> > For Clang, we require Clang >= 18 and Clang >= 17 already supports
> > R_LARCH_{32,64}_PCREL, so we can always assume Clang is fine for
> > objtool.
>
> For what it's worth, I have noticed some warnings with clang that I
> don't see with GCC but I only filed an issue on our GitHub and never
> followed up on the mailing list, so sorry about that.
>
> https://github.com/ClangBuiltLinux/linux/issues/2024
>
> Might be tangential to this patch though but I felt it was worth
> mentioning.
The warnings in GCC build is definitely the issue handled by this patch.
But the warnings in Clang build should be a different issue. Can you
attach the kernel/events/core.o file from the Clang build for analysis?
I guess we need to disable more optimization...
I personally hate "pessimizing the code generation just for debugging"
with a passion so I never enabled objtool on LoongArch, thus I didn't
notice the issue.
--
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University
On Wed, Jun 05, 2024 at 01:54:24PM +0800, Xi Ruoyao wrote: > On Tue, 2024-06-04 at 22:43 -0700, Nathan Chancellor wrote: > > For what it's worth, I have noticed some warnings with clang that I > > don't see with GCC but I only filed an issue on our GitHub and never > > followed up on the mailing list, so sorry about that. > > > > https://github.com/ClangBuiltLinux/linux/issues/2024 > > > > Might be tangential to this patch though but I felt it was worth > > mentioning. > > The warnings in GCC build is definitely the issue handled by this patch. > But the warnings in Clang build should be a different issue. Can you > attach the kernel/events/core.o file from the Clang build for analysis? > I guess we need to disable more optimization... Sure thing. Let me know if there are any issues with the attachment. Cheers, Nathan ELF � A @ @ ) init_wait_var_entry perf_output_copy sized_strscpy memcpy sw_perf_event_destroy exclusive_event_destroy .data..read_mostly perf_event_addr_filters_apply get_user_pages_fast_only hugetlb_optimize_vmemmap_key bpf_stats_enabled_key __perf_event_init_context.__key perf_event_init_all_cpus.__key perf_event_init_task.__key perf_event_alloc.__key rb_free_aux rb_alloc_aux update_cgrp_time_from_cpuctx put_pmu_ctx put_ctx get_ctx add_event_to_ctx perf_cpu_task_ctx free_ctx mux_interval_mutex perf_sched_mutex proc_dointvec_minmax __perf_event_overflow nr_addr_filters_show perf_event_mux_interval_ms_show __export_symbol_perf_event_sysfs_show type_show context_equiv free_percpu .data..percpu perf_event_exit_cpu perf_event_init_cpu pmus_srcu synchronize_srcu free_event_rcu kvfree_call_rcu get_state_synchronize_rcu cond_synchronize_rcu rb_free_rcu free_epc_rcu perf_cpu_context find_get_pmu_context __perf_event_exit_context find_get_context perf_adjust_freq_unthr_context perf_swevent_put_recursion_context __export_symbol_perf_swevent_get_recursion_context perf_unpin_context __perf_install_in_context __perf_remove_from_context perf_pin_task_context perf_lock_task_context __export_symbol_perf_pmu_migrate_context .rela.init.text .rela.text cgroup_taskset_next rb_next perf_event_output perf_event_set_output perf_event_namespaces_output perf_event_cgroup_output perf_event_mmap_output perf_event_comm_output perf_event_ksymbol_output perf_event_task_output perf_event_switch_output perf_event_bpf_output perf_event_text_poke_output mmput fput ring_buffer_put __folio_put path_put bpf_prog_put module_put perf_event_delayed_put __pmu_ctx_sched_out task_ctx_sched_out event_sched_out __perf_event_task_sched_out cgroup_taskset_first rb_first sched_cb_list perf_event_groups_insert perf_swevent_start cpu_clock_event_start task_clock_event_start __perf_event_account_interrupt perf_reboot perf_throttled_count perf_sched_count kstrtoint perf_event_modify_breakpoint init_hw_breakpoint perf_pmu_nop_int perf_event_nop_int perf_swevent perf_event_aux_event perf_get_aux_event ___perf_sw_event account_event perf_swevent_event perf_event_exit_event inherit_event perf_try_init_event prepare_to_wait_event perf_get_event perf_bp_event list_del_event perf_event_bpf_event _free_event .comment sysctl_perf_cpu_time_max_percent perf_event_idx_default perf_mmap_fault __mutex_init perf_swevent_init cpu_clock_event_init task_clock_event_init perf_event_init perf_event_sysfs_init hrtimer_init .rela.initcall6.init ___ratelimit _find_next_bit finish_wait perf_fget_light memset __per_cpu_offset ktime_get_with_offset _perf_event_reset fget __fdget swevent_hlist_get perf_event_get ring_buffer_get bpf_prog_get try_module_get init_srcu_struct __put_task_struct perf_event_sync_stat perf_event_cgrp_subsys perf_event_init_all_cpus __num_online_cpus pmus pmu_bus nr_namespaces_events perf_adjust_freq_unthr_events nr_freq_events nr_cgroup_events nr_mmap_events nr_comm_events nr_ksymbol_events nr_task_events nr_switch_events nr_bpf_events nr_text_poke_events nr_build_id_events perf_sched_events pmu_sb_events ptrace_may_access .bss pmu_dev_attrs perf_event_attrs dev_attr_nr_addr_filters put_callchain_buffers get_callchain_buffers perf_duration_warn._rs pmu_dev_groups sysfs_update_groups perf_mmap_vmops perf_fops perf_event_parse_addr_filter.actions mntns_operations netns_operations utsns_operations userns_operations cgroupns_operations pidns_operations ipcns_operations if_tokens ktime_get_raw_fast_ns ktime_get_mono_fast_ns __task_pid_nr_ns ktime_get_real_ns ktime_get_clocktai_ns ktime_get_boottime_ns hrtimer_start_range_ns perf_sample_period_ns put_pid_ns init_pid_ns task_active_pid_ns perf_sample_allowed_ns dev_attr_perf_event_mux_interval_ms __perf_regs nop_txn_flags get_unused_fd_flags perf_log_lost_samples kmalloc_caches perf_sched_cb_usages perf_event_namespaces nr_cpu_ids perf_copy_attr .rodata.str task_curr rb_insert_color css_tryget_online_from_dir __export_symbol_perf_pmu_unregister __export_symbol_perf_pmu_register bus_register __export_symbol_perf_event_create_kernel_counter __copy_user perf_get_regs_user strndup_user check_zeroed_user fasync_helper perf_remove_from_owner perf_swevent_hrtimer perf_cpu_time_max_percent_handler perf_mux_hrtimer_handler perf_event_max_sample_rate_handler register_reboot_notifier perf_reboot_notifier perf_prepare_header pmu_idr wake_up_var system_wq _raw_spin_unlock_irq _raw_spin_lock_irq perf_pending_irq perf_throttled_seq pmu_dev_attr_group inherit_task_group perf_event_wakeup kstrdup match_strdup __wake_up __perf_pmu_output_stop perf_swevent_stop cpu_clock_event_stop task_clock_event_stop __perf_event_stop perf_cgroup_set_timestamp perf_output_skip strsep perf_event_mmap perf_mmap __pte_offset_map .rela.data.rel.ro perf_pmu_start_txn perf_pmu_commit_txn perf_pmu_nop_txn perf_pmu_cancel_txn security_locked_down perf_duration_warn event_function remote_function perf_check_permission queue_delayed_work_on irq_work_queue_on perf_output_begin __empty_callchain get_perf_callchain ctx_sched_in event_sched_in ctx_groups_sched_in __perf_event_task_sched_in merge_sched_in delayed_work_timer_fn security_perf_event_open __se_sys_perf_event_open perf_mmap_open strlen match_token perf_event_comm init_mm get_task_mm perf_ioctl perf_event_ksymbol .rela.export_symbol kstrtoull perf_poll fd_install event_function_call __stack_chk_fail perf_allow_kernel __export_symbol_perf_event_release_kernel perf_swevent_del cpu_clock_event_del task_clock_event_del device_del hrtimer_cancel perf_event_disable_local perf_event_read_local __warn_printk perf_event_exit_task perf_event_init_task perf_pending_task perf_event_free_task perf_pmu_sched_task __cpu_online_mask perf_online_mask __cpu_possible_mask perf_duration_work perf_sched_work perf_event_fork perf_sample_event_took mutex_unlock _raw_spin_unlock __srcu_read_unlock __rcu_read_unlock cpus_read_unlock sysctl_perf_event_mlock perf_cpu_clock perf_event_set_clock local_clock perf_task_clock sched_clock atomic_dec_and_mutex_lock pmus_lock _raw_spin_lock __srcu_read_lock __rcu_read_lock cpus_read_lock max_samples_per_tick perf_event_task_tick modify_user_hw_breakpoint_check sysctl_perf_event_max_stack __SCK__perf_snapshot_branch_stack .note.GNU-stack perf_mux_hrtimer_restart_ipi perf_reg_abi running_sample_length ns_get_path kern_path file_path __export_symbol_perf_event_refresh perf_cgroup_switch ring_buffer_attach perf_cgroup_attach perf_group_detach __report_avg perf_event_print_debug perf_event_set_bpf_prog perf_event_free_bpf_prog pmu_bus_running __hrtimer_get_remaining .llvm_addrsig sprintf scnprintf send_sig_perf __kmalloc_cache_noprof __kmalloc_cache_node_noprof __kmalloc_node_noprof kmem_cache_alloc_node_noprof __kmalloc_noprof pcpu_alloc_noprof kmem_cache_alloc_noprof perf_event__id_header_size perf_event__header_size perf_event_validate_size perf_get_page_size device_initialize __perf_pmu_remove idr_remove __perf_cgroup_move bpf_prog_active _atomic_dec_and_raw_lock_irqsave _raw_spin_lock_irqsave perf_reg_value __export_symbol_perf_event_read_value __perf_event_read_value __var_waitqueue irq_work_queue security_perf_event_write up_write down_write perf_event_set_state ctx_event_to_rotate refcount_warn_saturate sysctl_perf_event_sample_rate kmem_cache_create perf_reg_validate __export_symbol_perf_event_pause build_id_parse perf_mmap_close rb_erase pmu_dev_release perf_release vm_map_base _raw_spin_unlock_irqrestore perf_event_mux_interval_ms_store dev_attr_type perf_pmu_register.__already_done __min_heap_pop.__already_done perf_event_ksymbol.__already_done perf_cgroup_css_online perf_event_update_time dev_set_name arch_vma_name dynamic_preempt_schedule perf_log_throttle perf_output_sample perf_prepare_sample perf_event__output_id_sample anon_inode_getfile device_remove_file smp_call_function_single down_read_interruptible pmu_dev_is_visible swevent_htable .rela__ex_table .rela__jump_table .rela__bug_table invalid_pte_table invalid_pmd_table .rela.discard.addressable static_key_disable perf_ctx_disable perf_pmu_disable __export_symbol_perf_event_disable __perf_event_disable perf_event_task_disable ns_capable static_key_enable perf_ctx_enable perf_pmu_enable __export_symbol_perf_event_enable __perf_event_enable perf_event_task_enable exclusive_event_installable .rela.discard.unreachable .rela.discard.reachable perf_event_text_poke perf_event_cache visit_groups_merge perf_event_init_userpage __export_symbol_perf_event_update_userpage arch_perf_update_userpage perf_mmap_to_page kfree security_perf_event_free perf_cgroup_css_free kmem_cache_free rb_free kernfs_path_from_node numa_node .data.once put_device perf_addr_filters_splice dynamic_preempt_schedule_notrace perf_event_output_forward hrtimer_forward perf_output_begin_forward perf_event_output_backward perf_output_begin_backward __stack_chk_guard perf_adjust_period __export_symbol_perf_event_period __perf_event_period perf_swevent_set_period mas_find idr_find perf_output_end get_uid free_uid find_lively_task_by_vpid find_task_by_vpid perf_pmu_nop_void sysctl_perf_event_paranoid __virt_addr_valid __export_symbol_perf_report_aux_output_id perf_event_id __perf_event_header__init_id put_unused_fd perf_sched_delayed __report_allowed perf_event_ctx_lock_nested perf_event_itrace_started perf_swevent_enabled ctx_resched perf_pmu_resched dynamic_might_resched dynamic_cond_resched perf_swevent_add cpu_clock_event_add task_clock_event_add __perf_read_group_add task_work_add device_add perf_output_read perf_swevent_read cpu_clock_event_read task_clock_event_read security_perf_event_read __perf_event_read up_read down_read perf_read __init_waitqueue_head pmu_dev_alloc security_perf_event_alloc perf_cgroup_css_alloc idr_alloc rb_alloc kill_fasync perf_fasync __export_symbol_perf_event_addr_filters_sync irq_work_sync static_key_slow_inc perf_sched_cb_inc perf_event_disable_inatomic perf_event_exec static_key_slow_dec perf_sched_cb_dec core.c perf_iterate_sb perf_ctx_sched_task_cb .strtab .symtab perf_event_swap_task_ctx_data cpu_data .rela.data __UNIQUE_ID___addressable_perf_event_addr_filters_sync689 __UNIQUE_ID___addressable_perf_event_read_value739 __UNIQUE_ID___addressable_perf_event_release_kernel738 __initcall__kmod_core__885_13833_perf_event_sysfs_init6 __UNIQUE_ID___addressable_perf_swevent_get_recursion_context836 __UNIQUE_ID___addressable_perf_report_aux_output_id826 .rodata.cst16 __UNIQUE_ID___addressable_perf_pmu_migrate_context865 perf_event_alloc.__key.35 __UNIQUE_ID___addressable_perf_event_enable684 __sw_hweight64 __UNIQUE_ID___addressable_perf_event_create_kernel_counter864 __UNIQUE_ID___addressable_perf_pmu_unregister854 __UNIQUE_ID___addressable_perf_event_period744 .rodata.str4.4 __UNIQUE_ID___addressable_perf_event_sysfs_show883 __UNIQUE_ID___addressable_perf_pmu_register853 perf_event_alloc.__key.33 __UNIQUE_ID___addressable_perf_event_pause742 __UNIQUE_ID___addressable_perf_event_disable671 __UNIQUE_ID___addressable_perf_event_update_userpage751 .rodata.str1.1 __static_call_return0 __UNIQUE_ID___addressable_perf_event_refresh690 .orc_unwind .orc_unwind_ip .rela.orc_unwind_ip � ��� ���( L @ @ @�� @c��a �)v �)� �� V���(@� @��K� X$ T�� D�� �L� � �� �(����E ��I �� � �� �)�5w� ��"