forked from mirrors/linux
		
	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 | #endif | ||||||
| #define HAVE_FUNCTION_GRAPH_RET_ADDR_PTR | #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 | #define ARCH_SUPPORTS_FTRACE_OPS 1 | ||||||
| #ifndef __ASSEMBLY__ | #ifndef __ASSEMBLY__ | ||||||
| void _mcount(void); | void MCOUNT_NAME(void); | ||||||
| static inline unsigned long ftrace_call_adjust(unsigned long addr) | static inline unsigned long ftrace_call_adjust(unsigned long addr) | ||||||
| { | { | ||||||
| 	return addr; | 	return addr; | ||||||
|  | @ -36,7 +46,7 @@ struct dyn_arch_ftrace { | ||||||
|  * both auipc and jalr at the same time. |  * 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_SIGN_MASK		(0x00000800) | ||||||
| #define JALR_OFFSET_MASK	(0x00000fff) | #define JALR_OFFSET_MASK	(0x00000fff) | ||||||
| #define AUIPC_OFFSET_MASK	(0xfffff000) | #define AUIPC_OFFSET_MASK	(0xfffff000) | ||||||
|  |  | ||||||
|  | @ -47,8 +47,8 @@ | ||||||
| 
 | 
 | ||||||
| ENTRY(ftrace_stub) | ENTRY(ftrace_stub) | ||||||
| #ifdef CONFIG_DYNAMIC_FTRACE | #ifdef CONFIG_DYNAMIC_FTRACE | ||||||
|        .global _mcount
 |        .global MCOUNT_NAME
 | ||||||
|        .set    _mcount, ftrace_stub |        .set    MCOUNT_NAME, ftrace_stub | ||||||
| #endif | #endif | ||||||
| 	ret | 	ret | ||||||
| ENDPROC(ftrace_stub) | ENDPROC(ftrace_stub) | ||||||
|  | @ -78,7 +78,7 @@ ENDPROC(return_to_handler) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #ifndef CONFIG_DYNAMIC_FTRACE | #ifndef CONFIG_DYNAMIC_FTRACE | ||||||
| ENTRY(_mcount) | ENTRY(MCOUNT_NAME) | ||||||
| 	la	t4, ftrace_stub | 	la	t4, ftrace_stub | ||||||
| #ifdef CONFIG_FUNCTION_GRAPH_TRACER | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||||||
| 	la	t0, ftrace_graph_return | 	la	t0, ftrace_graph_return | ||||||
|  | @ -124,6 +124,6 @@ do_trace: | ||||||
| 	jalr	t5 | 	jalr	t5 | ||||||
| 	RESTORE_ABI_STATE | 	RESTORE_ABI_STATE | ||||||
| 	ret | 	ret | ||||||
| ENDPROC(_mcount) | ENDPROC(MCOUNT_NAME) | ||||||
| #endif | #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\$"; |     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; | ||||||
| } elsif ($arch eq "riscv") { | } elsif ($arch eq "riscv") { | ||||||
|     $function_regex = "^([0-9a-fA-F]+)\\s+<([^.0-9][0-9a-zA-Z_\\.]+)>:"; |     $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"; |     $type = ".quad"; | ||||||
|     $alignment = 2; |     $alignment = 2; | ||||||
| } elsif ($arch eq "nds32") { | } elsif ($arch eq "nds32") { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Nathan Chancellor
						Nathan Chancellor