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 | 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 | 263 | ifndef CONFIG_FRAME_POINTER |
| 263 | 264 | objtool_args += --no-fp |
| 264 | 265 | endif |
| @@ -279,6 +280,11 @@ objtool_obj = $(if $(patsubst y%,, \ · 14 unmodified lines | ||
| 279 | 280 | endif # SKIP_STACK_VALIDATION |
| 280 | 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 | 288 | define rule_cc_o_c |
| 283 | 289 | $(call echo-cmd,checksrc) $(cmd_checksrc) \ |
| 284 | 290 | $(call cmd_and_fixdep,cc_o_c) \ |
| @@ -301,13 +307,13 @@ cmd_undef_syms = echo · 16 unmodified lines | ||
| 301 | 307 | endif |
| 302 | 308 | |
| 303 | 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 | 311 | $(call cmd,force_checksrc) |
| 306 | 312 | $(call if_changed_rule,cc_o_c) |
| 307 | 313 | |
| 308 | 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 | 317 | $(call cmd,force_checksrc) |
| 312 | 318 | $(call if_changed_rule,cc_o_c) |
| 313 | 319 | @{ echo $(@:.o=.ko); echo $@; \ |
| @@ -402,7 +408,7 @@ cmd_modversions_S = \ · 88 unmodified lines | ||
| 402 | 408 | endif |
| 403 | 409 | endif |
| 404 | 410 | |
| 405 | −$(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE | |
| 411 | +$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE | |
| 406 | 412 | $(call if_changed_rule,as_o_S) |
| 407 | 413 | |
| 408 | 414 | targets += $(real-objs-y) $(real-objs-m) $(lib-y) |