struct guest_event              ev;
 };
 
+enum build_id_rewrite_style {
+       BID_RWS__NONE = 0,
+       BID_RWS__INJECT_HEADER_LAZY,
+       BID_RWS__INJECT_HEADER_ALL,
+};
+
 struct perf_inject {
        struct perf_tool        tool;
        struct perf_session     *session;
-       bool                    build_ids;
-       bool                    build_id_all;
+       enum build_id_rewrite_style build_id_style;
        bool                    sched_stat;
        bool                    have_auxtrace;
        bool                    strip;
 
        signal(SIGINT, sig_handler);
 
-       if (inject->build_ids || inject->sched_stat ||
-           inject->itrace_synth_opts.set || inject->build_id_all) {
+       if (inject->build_id_style != BID_RWS__NONE || inject->sched_stat ||
+           inject->itrace_synth_opts.set) {
                inject->tool.mmap         = perf_event__repipe_mmap;
                inject->tool.mmap2        = perf_event__repipe_mmap2;
                inject->tool.fork         = perf_event__repipe_fork;
 
        output_data_offset = perf_session__data_offset(session->evlist);
 
-       if (inject->build_id_all) {
+       if (inject->build_id_style == BID_RWS__INJECT_HEADER_ALL) {
                inject->tool.mmap         = perf_event__repipe_buildid_mmap;
                inject->tool.mmap2        = perf_event__repipe_buildid_mmap2;
-       } else if (inject->build_ids) {
+       } else if (inject->build_id_style == BID_RWS__INJECT_HEADER_LAZY) {
                inject->tool.sample = perf_event__inject_buildid;
        } else if (inject->sched_stat) {
                struct evsel *evsel;
                        .inject = inject,
                };
 
-               if (inject->build_ids)
-                       perf_header__set_feat(&session->header,
-                                             HEADER_BUILD_ID);
+               if (inject->build_id_style == BID_RWS__INJECT_HEADER_LAZY ||
+                   inject->build_id_style == BID_RWS__INJECT_HEADER_ALL)
+                       perf_header__set_feat(&session->header, HEADER_BUILD_ID);
                /*
                 * Keep all buildids when there is unprocessed AUX data because
                 * it is not known which ones the AUX trace hits.
        int ret;
        bool repipe = true;
        const char *known_build_ids = NULL;
+       bool build_ids;
+       bool build_id_all;
 
        struct option options[] = {
-               OPT_BOOLEAN('b', "build-ids", &inject.build_ids,
+               OPT_BOOLEAN('b', "build-ids", &build_ids,
                            "Inject build-ids into the output stream"),
-               OPT_BOOLEAN(0, "buildid-all", &inject.build_id_all,
+               OPT_BOOLEAN(0, "buildid-all", &build_id_all,
                            "Inject build-ids of all DSOs into the output stream"),
                OPT_STRING(0, "known-build-ids", &known_build_ids,
                           "buildid path [,buildid path...]",
                        return -1;
                }
        }
+       if (build_ids)
+               inject.build_id_style = BID_RWS__INJECT_HEADER_LAZY;
+       if (build_id_all)
+               inject.build_id_style = BID_RWS__INJECT_HEADER_ALL;
 
        data.path = inject.input_name;
        if (!strcmp(inject.input_name, "-") || inject.output.is_pipe) {
                        repipe = false;
        }
        ordered_events = inject.jit_mode || inject.sched_stat ||
-               (inject.build_ids && !inject.build_id_all);
+               (inject.build_id_style == BID_RWS__INJECT_HEADER_LAZY);
        perf_tool__init(&inject.tool, ordered_events);
        inject.tool.sample              = perf_event__repipe_sample;
        inject.tool.read                = perf_event__repipe_sample;
                        goto out_delete;
        }
 
-       if (inject.build_ids && !inject.build_id_all) {
+       if (inject.build_id_style == BID_RWS__INJECT_HEADER_LAZY) {
                /*
                 * to make sure the mmap records are ordered correctly
                 * and so that the correct especially due to jitted code
                 * inject the jit mmaps at the same time for now.
                 */
                inject.tool.ordering_requires_timestamps = true;
-               if (known_build_ids != NULL) {
-                       inject.known_build_ids =
-                               perf_inject__parse_known_build_ids(known_build_ids);
+       }
+       if (inject.build_id_style != BID_RWS__NONE && known_build_ids != NULL) {
+               inject.known_build_ids =
+                       perf_inject__parse_known_build_ids(known_build_ids);
 
-                       if (inject.known_build_ids == NULL) {
-                               pr_err("Couldn't parse known build ids.\n");
-                               goto out_delete;
-                       }
+               if (inject.known_build_ids == NULL) {
+                       pr_err("Couldn't parse known build ids.\n");
+                       goto out_delete;
                }
        }