From f3f7537b6e06db38f6136a4342b8275784301585 Mon Sep 17 00:00:00 2001 From: Matthias Maennich Date: Tue, 21 May 2019 05:39:22 +0100 Subject: [PATCH] abidw: add option to only emit file names (--short-locs) Various emitted directories contain machine specific information and therefore break reproducibility of abidw's output across different build paths. Hence introduce --short-locs to only emit file names. Thanks to earlier changes, adding an option boils down to adding it to set_opts and to the write_context along with some auxiliary functions for setting and getting. * include/abg-writer.h (set_short_locs): Declare new function. (set_common_options): Use it. set_opts * src/abg-writer.cc (write_context::m_short_locs): New data member. (write_context::write_context): Initialize it. (write_context::{g,s}et_short_locs): Define new accessors. (write_location, write_translation_unit, write_corpus): Honour the new write_context::get_short_locs property. (set_short_locs): Define new function. * tools/abidw.cc (options::short_locs): New data member. (display_usage): Help string for the new --no-show-locs option. (parse_command_line): Parse the new --no-show-locs option. Signed-off-by: Matthias Maennich Signed-off-by: Dodji Seketeli --- include/abg-writer.h | 4 ++++ src/abg-writer.cc | 50 ++++++++++++++++++++++++++++++++++++++++++-------- tools/abidw.cc | 5 +++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/include/abg-writer.h b/include/abg-writer.h index 8150bf1..a2904d7 100644 --- a/include/abg-writer.h +++ b/include/abg-writer.h @@ -62,6 +62,9 @@ set_write_corpus_path(write_context& ctxt, bool flag); void set_write_comp_dir(write_context& ctxt, bool flag); +void +set_short_locs(write_context& ctxt, bool flag); + /// A convenience generic function to set common options (usually used /// by Libabigail tools) from a generic options carrying-object, into /// a given @ref write_context. @@ -80,6 +83,7 @@ set_common_options(write_context& ctxt, const OPTS& opts) set_write_architecture(ctxt, opts.write_architecture); set_write_corpus_path(ctxt, opts.write_corpus_path); set_write_comp_dir(ctxt, opts.write_comp_dir); + set_short_locs(ctxt, opts.short_locs); } void diff --git a/src/abg-writer.cc b/src/abg-writer.cc index 4991a81..1b923c5 100644 --- a/src/abg-writer.cc +++ b/src/abg-writer.cc @@ -168,6 +168,7 @@ class write_context bool m_write_architecture; bool m_write_corpus_path; bool m_write_comp_dir; + bool m_short_locs; mutable type_ptr_map m_type_id_map; mutable type_ptr_set_type m_emitted_type_set; type_ptr_set_type m_emitted_decl_only_set; @@ -199,7 +200,8 @@ public: m_show_locs(true), m_write_architecture(true), m_write_corpus_path(true), - m_write_comp_dir(true) + m_write_comp_dir(true), + m_short_locs(false) {} /// Getter of the environment we are operating from. @@ -283,6 +285,19 @@ public: set_write_comp_dir(bool f) {m_write_comp_dir = f;} + /// Getter of the short-locs option. + /// + /// @return true iff short locations shall be emitted + bool + get_short_locs() + {return m_short_locs;} + + /// Setter of the short-locs option + /// + /// @param f the new value of the flag. + void + set_short_locs(bool f) + {m_short_locs = f;} /// Getter of the "show-locs" option. /// @@ -1108,6 +1123,9 @@ write_location(const location& loc, write_context& ctxt) ostream &o = ctxt.get_ostream(); + if (ctxt.get_short_locs()) + tools_utils::base_name(filepath, filepath); + o << " filepath='" << xml::escape_xml_string(filepath) << "'" << " line='" << line << "'" << " column='" << column << "'"; @@ -1848,6 +1866,18 @@ void set_write_comp_dir(write_context& ctxt, bool flag) {ctxt.set_write_comp_dir(flag);} +/// Set the 'short-locs' flag. +/// +/// When this flag is set then the XML writer will emit only file names +/// rather than full paths. +/// +/// @param ctxt the context to set this flag on to. +/// +/// @param flag the new value of the 'short-locs' flag. +void +set_short_locs(write_context& ctxt, bool flag) +{ctxt.set_short_locs(flag);} + /// Serialize a translation unit to an output stream. /// /// @param ctxt the context of the serialization. It contains e.g, @@ -1877,8 +1907,11 @@ write_translation_unit(write_context& ctxt, if (tu.get_address_size() != 0) o << " address-size='" << static_cast(tu.get_address_size()) << "'"; - if (!tu.get_path().empty()) - o << " path='" << xml::escape_xml_string(tu.get_path()) << "'"; + std::string tu_path = tu.get_path(); + if (ctxt.get_short_locs()) + tools_utils::base_name(tu_path, tu_path); + if (!tu_path.empty()) + o << " path='" << xml::escape_xml_string(tu_path) << "'"; if (!tu.get_compilation_dir_path().empty() && ctxt.get_write_comp_dir()) o << " comp-dir-path='" @@ -4197,14 +4230,15 @@ write_corpus(write_context& ctxt, if (!ctxt.get_write_corpus_path()) { if (member_of_group) - { - size_t pos = corpus_path.rfind('/'); - corpus_path - = corpus_path.substr(pos != std::string::npos ? pos + 1 : 0); - } + tools_utils::base_name(corpus_path, corpus_path); else corpus_path.clear(); } + else + { + if (ctxt.get_short_locs()) + tools_utils::base_name(corpus_path, corpus_path); + } if (!corpus_path.empty()) out << " path='" << xml::escape_xml_string(corpus_path) << "'"; diff --git a/tools/abidw.cc b/tools/abidw.cc index 32c5c87..e5ca872 100644 --- a/tools/abidw.cc +++ b/tools/abidw.cc @@ -97,6 +97,7 @@ struct options bool write_architecture; bool write_corpus_path; bool write_comp_dir; + bool short_locs; bool load_all_types; bool linux_kernel_mode; bool corpus_group_for_linux; @@ -114,6 +115,7 @@ struct options write_architecture(true), write_corpus_path(true), write_comp_dir(true), + short_locs(false), load_all_types(), linux_kernel_mode(true), corpus_group_for_linux(false), @@ -152,6 +154,7 @@ display_usage(const string& prog_name, ostream& out) << " --no-architecture do not emit architecture info in the output\n" << " --no-corpus-path do not take the path to the corpora into account\n" << " --no-show-locs do not show location information\n" + << " --short-locs only print filenames rather than paths\n" << " --no-comp-dir-path do not show compilation path information\n" << " --check-alternate-debug-info check alternate debug info " "of \n" @@ -260,6 +263,8 @@ parse_command_line(int argc, char* argv[], options& opts) opts.write_corpus_path = false; else if (!strcmp(argv[i], "--no-show-locs")) opts.show_locs = false; + else if (!strcmp(argv[i], "--short-locs")) + opts.short_locs = true; else if (!strcmp(argv[i], "--no-comp-dir-path")) opts.write_comp_dir = false; else if (!strcmp(argv[i], "--check-alternate-debug-info") -- 2.7.4