mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	riscv: Workaround mcount name prior to clang-13
Prior to clang 13.0.0, the RISC-V name for the mcount symbol was "mcount", which differs from the GCC version of "_mcount", which results in the following errors: riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_level': main.c:(.text+0xe): undefined reference to `mcount' riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_start': main.c:(.text+0x4e): undefined reference to `mcount' riscv64-linux-gnu-ld: init/main.o: in function `__traceiter_initcall_finish': main.c:(.text+0x92): undefined reference to `mcount' riscv64-linux-gnu-ld: init/main.o: in function `.LBB32_28': main.c:(.text+0x30c): undefined reference to `mcount' riscv64-linux-gnu-ld: init/main.o: in function `free_initmem': main.c:(.text+0x54c): undefined reference to `mcount' This has been corrected in https://reviews.llvm.org/D98881 but the minimum supported clang version is 10.0.1. To avoid build errors and to gain a working function tracer, adjust the name of the mcount symbol for older versions of clang in mount.S and recordmcount.pl. Link: https://github.com/ClangBuiltLinux/linux/issues/1331 Signed-off-by: Nathan Chancellor <nathan@kernel.org> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
This commit is contained in:
		
							parent
							
								
									2f095504f4
								
							
						
					
					
						commit
						7ce0477150
					
				
					 3 changed files with 18 additions and 8 deletions
				
			
		|  | @ -13,9 +13,19 @@ | |||
| #endif | ||||
| #define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR | ||||
| 
 | ||||
| /*
 | ||||
|  * Clang prior to 13 had "mcount" instead of "_mcount": | ||||
|  * https://reviews.llvm.org/D98881
 | ||||
|  */ | ||||
| #if defined(CONFIG_CC_IS_GCC) || CONFIG_CLANG_VERSION >= 130000 | ||||
| #define MCOUNT_NAME _mcount | ||||
| #else | ||||
| #define MCOUNT_NAME mcount | ||||
| #endif | ||||
| 
 | ||||
| #define ARCH_SUPPORTS_FTRACE_OPS 1 | ||||
| #ifndef __ASSEMBLY__ | ||||
| void _mcount(void); | ||||
| void MCOUNT_NAME(void); | ||||
| static inline unsigned long ftrace_call_adjust(unsigned long addr) | ||||
| { | ||||
| 	return addr; | ||||
|  | @ -36,7 +46,7 @@ struct dyn_arch_ftrace { | |||
|  * both auipc and jalr at the same time. | ||||
|  */ | ||||
| 
 | ||||
| #define MCOUNT_ADDR		((unsigned long)_mcount) | ||||
| #define MCOUNT_ADDR		((unsigned long)MCOUNT_NAME) | ||||
| #define JALR_SIGN_MASK		(0x00000800) | ||||
| #define JALR_OFFSET_MASK	(0x00000fff) | ||||
| #define AUIPC_OFFSET_MASK	(0xfffff000) | ||||
|  |  | |||
|  | @ -47,8 +47,8 @@ | |||
| 
 | ||||
| ENTRY(ftrace_stub) | ||||
| #ifdef CONFIG_DYNAMIC_FTRACE | ||||
|        .global _mcount
 | ||||
|        .set    _mcount, ftrace_stub | ||||
|        .global MCOUNT_NAME
 | ||||
|        .set    MCOUNT_NAME, ftrace_stub | ||||
| #endif | ||||
| 	ret | ||||
| ENDPROC(ftrace_stub) | ||||
|  | @ -78,7 +78,7 @@ ENDPROC(return_to_handler) | |||
| #endif | ||||
| 
 | ||||
| #ifndef CONFIG_DYNAMIC_FTRACE | ||||
| ENTRY(_mcount) | ||||
| ENTRY(MCOUNT_NAME) | ||||
| 	la	t4, ftrace_stub | ||||
| #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||||
| 	la	t0, ftrace_graph_return | ||||
|  | @ -124,6 +124,6 @@ do_trace: | |||
| 	jalr	t5 | ||||
| 	RESTORE_ABI_STATE | ||||
| 	ret | ||||
| ENDPROC(_mcount) | ||||
| ENDPROC(MCOUNT_NAME) | ||||
| #endif | ||||
| EXPORT_SYMBOL(_mcount) | ||||
| EXPORT_SYMBOL(MCOUNT_NAME) | ||||
|  |  | |||
|  | @ -392,7 +392,7 @@ if ($arch eq "x86_64") { | |||
|     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; | ||||
| } elsif ($arch eq "riscv") { | ||||
|     $function_regex = "^([0-9a-fA-F]+)\\s+<([^.0-9][0-9a-zA-Z_\\.]+)>:"; | ||||
|     $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_mcount\$"; | ||||
|     $mcount_regex = "^\\s*([0-9a-fA-F]+):\\sR_RISCV_CALL(_PLT)?\\s_?mcount\$"; | ||||
|     $type = ".quad"; | ||||
|     $alignment = 2; | ||||
| } elsif ($arch eq "nds32") { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Nathan Chancellor
						Nathan Chancellor