Add the new ORC unwinder which is enabled by CONFIG_ORC_UNWINDER=y. It plugs into the existing x86 unwinder framework. It relies on objtool to generate the needed .orc_unwind and .orc_unwind_ip sections. For more details on why ORC is used instead of DWARF, see Documentation/x86/orc-unwinder.txt - but the short version is that it's a simplified, fundamentally more robust debugninfo data structure, which also allows up to two orders of magnitude faster lookups than the DWARF unwinder - which matters to profiling workloads like perf. Thanks to Andy Lutomirski for the performance improvement ideas: splitting the ORC unwind table into two parallel arrays and creating a fast lookup table to search a subset of the unwind table.
Showing the changes to scripts (1 of 18 files). Show all
Unified · Split
| @@ -258,7 +258,8 @@ ifneq ($(SKIP_STACK_VALIDATION),1) · 257 unmodified lines | |||
| 258 | 258 | ||
| 259 | __objtool_obj := $(objtree)/tools/objtool/objtool | 259 | __objtool_obj := $(objtree)/tools/objtool/objtool |
| 260 | 260 | ||
| 261 | objtool_args = check | 261 | objtool_args = $(if $(CONFIG_ORC_UNWINDER),orc generate,check) |
| 262 | |||
| 262 | ifndef CONFIG_FRAME_POINTER | 263 | ifndef CONFIG_FRAME_POINTER |
| 263 | objtool_args += --no-fp | 264 | objtool_args += --no-fp |
| 264 | endif | 265 | endif |
| @@ -279,6 +280,11 @@ objtool_obj = $(if $(patsubst y%,, \ · 14 unmodified lines | |||
| 279 | endif # SKIP_STACK_VALIDATION | 280 | endif # SKIP_STACK_VALIDATION |
| 280 | endif # CONFIG_STACK_VALIDATION | 281 | endif # CONFIG_STACK_VALIDATION |
| 281 | 282 | ||
| 283 | # Rebuild all objects when objtool changes, or is enabled/disabled. | ||
| 284 | objtool_dep = $(objtool_obj) \ | ||
| 285 | $(wildcard include/config/orc/unwinder.h \ | ||
| 286 | include/config/stack/validation.h) | ||
| 287 | |||
| 282 | define rule_cc_o_c | 288 | define rule_cc_o_c |
| 283 | $(call echo-cmd,checksrc) $(cmd_checksrc) \ | 289 | $(call echo-cmd,checksrc) $(cmd_checksrc) \ |
| 284 | $(call cmd_and_fixdep,cc_o_c) \ | 290 | $(call cmd_and_fixdep,cc_o_c) \ |
| @@ -301,13 +307,13 @@ cmd_undef_syms = echo · 16 unmodified lines | |||
| 301 | endif | 307 | endif |
| 302 | 308 | ||
| 303 | # Built-in and composite module parts | 309 | # Built-in and composite module parts |
| 304 | $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_obj) FORCE | 310 | $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE |
| 305 | $(call cmd,force_checksrc) | 311 | $(call cmd,force_checksrc) |
| 306 | $(call if_changed_rule,cc_o_c) | 312 | $(call if_changed_rule,cc_o_c) |
| 307 | 313 | ||
| 308 | # Single-part modules are special since we need to mark them in $(MODVERDIR) | 314 | # Single-part modules are special since we need to mark them in $(MODVERDIR) |
| 309 | 315 | ||
| 310 | $(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_obj) FORCE | 316 | $(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE |
| 311 | $(call cmd,force_checksrc) | 317 | $(call cmd,force_checksrc) |
| 312 | $(call if_changed_rule,cc_o_c) | 318 | $(call if_changed_rule,cc_o_c) |
| 313 | @{ echo $(@:.o=.ko); echo $@; \ | 319 | @{ echo $(@:.o=.ko); echo $@; \ |
| @@ -402,7 +408,7 @@ cmd_modversions_S = \ · 88 unmodified lines | |||
| 402 | endif | 408 | endif |
| 403 | endif | 409 | endif |
| 404 | 410 | ||
| 405 | $(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE | 411 | $(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE |
| 406 | $(call if_changed_rule,as_o_S) | 412 | $(call if_changed_rule,as_o_S) |
| 407 | 413 | ||
| 408 | targets += $(real-objs-y) $(real-objs-m) $(lib-y) | 414 | targets += $(real-objs-y) $(real-objs-m) $(lib-y) |