Skip to content

Refactoring around the goto-cc entry point. #5442

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Aug 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 32 additions & 15 deletions src/goto-cc/armcc_cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,14 @@ Author: Daniel Kroening

#include "armcc_cmdline.h"

#include <util/optional.h>
#include <util/prefix.h>

#include <algorithm>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>

/// parses the command line options into a cmdlinet
/// \par parameters: argument count, argument strings
Expand Down Expand Up @@ -195,7 +201,8 @@ static const char *options_no_arg[]=
nullptr
};

static const char *options_with_prefix[]=
// clang-format off
static const std::vector<std::string> options_with_prefix
{
"--project=",
"--workdir=",
Expand Down Expand Up @@ -241,11 +248,10 @@ static const char *options_with_prefix[]=
"--configure_sysroot=",
"--configure_cpp_headers=",
"--configure_extra_includes=",
"--configure_extra_libraries=",
nullptr
"--configure_extra_libraries="
};

static const char *options_with_arg[]=
static const std::vector<std::string> options_with_arg
{
// goto-cc specific
"--verbosity",
Expand All @@ -261,9 +267,21 @@ static const char *options_with_arg[]=
"-Warmcc,",
"-o",
"--cpu",
"--apcs",
nullptr
"--apcs"
};
// clang-format on

optionalt<std::string>
prefix_in_list(const std::string &option, const std::vector<std::string> &list)
{
const auto found =
std::find_if(list.cbegin(), list.cend(), [&](const std::string &argument) {
return has_prefix(argument, option);
});
if(found == list.cend())
return {};
return {*found};
}

bool armcc_cmdlinet::parse(int argc, const char **argv)
{
Expand All @@ -277,35 +295,34 @@ bool armcc_cmdlinet::parse(int argc, const char **argv)
}

// it starts with - and it isn't "-"

std::string prefix;
optionalt<std::string> prefix;

if(in_list(argv[i], options_no_arg))
{
// options that don't have any arguments
set(argv[i]);
}
else if(prefix_in_list(argv[i], options_with_arg, prefix))
else if((prefix = prefix_in_list(argv[i], options_with_arg)))
{
// options that have a separated _or_ concatenated argument
if(strlen(argv[i])>prefix.size()) // concatenated?
set(prefix, std::string(argv[i], prefix.size(), std::string::npos));
if(strlen(argv[i]) > prefix->size()) // Concatenated.
set(*prefix, std::string(argv[i], prefix->size(), std::string::npos));
else
{
// Separated.
if(i!=argc-1) // Guard against end of command line.
{
set(prefix, argv[i+1]);
set(*prefix, argv[i + 1]);
i++;
}
else
set(prefix, "");
set(*prefix, "");
}
}
else if(prefix_in_list(argv[i], options_with_prefix, prefix))
else if((prefix = prefix_in_list(argv[i], options_with_prefix)))
{
// options that have a concatenated argument
set(prefix, std::string(argv[i], prefix.size(), std::string::npos));
set(*prefix, std::string(argv[i], prefix->size(), std::string::npos));
}
else
{ // unrecognized option
Expand Down
30 changes: 11 additions & 19 deletions src/goto-cc/goto_cc_cmdline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ Date: April 2010

#include "goto_cc_cmdline.h"

#include <cstring>
#include <algorithm>
#include <cassert>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iostream>

#include <util/invariant.h>
#include <util/prefix.h>
Expand Down Expand Up @@ -46,23 +47,6 @@ bool goto_cc_cmdlinet::in_list(const char *option, const char **list)
return false;
}

bool goto_cc_cmdlinet::prefix_in_list(
const char *option,
const char **list,
std::string &prefix)
{
for(std::size_t i=0; list[i]!=nullptr; i++)
{
if(strncmp(option, list[i], strlen(list[i]))==0)
{
prefix=std::string(list[i]);
return true;
}
}

return false;
}

std::size_t goto_cc_cmdlinet::get_optnr(const std::string &opt_string)
{
optionalt<std::size_t> optnr;
Expand Down Expand Up @@ -134,3 +118,11 @@ void goto_cc_cmdlinet::add_infile_arg(const std::string &arg)
fclose(tmp);
}
}

bool goto_cc_cmdlinet::have_infile_arg() const

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should probably just make sure to put definitions in cpp files in general.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

{
return std::any_of(
parsed_argv.cbegin(), parsed_argv.cend(), [](const argt &arg) {
return arg.is_infile_name;
});
}
14 changes: 1 addition & 13 deletions src/goto-cc/goto_cc_cmdline.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,6 @@ class goto_cc_cmdlinet:public cmdlinet

static bool in_list(const char *option, const char **list);

static bool prefix_in_list(
const char *option,
const char **list,
std::string &prefix);

// never fails, will add if not found
std::size_t get_optnr(const std::string &option);

Expand Down Expand Up @@ -68,14 +63,7 @@ class goto_cc_cmdlinet:public cmdlinet
typedef std::list<argt> parsed_argvt;
parsed_argvt parsed_argv;

bool have_infile_arg() const
{
for(parsed_argvt::const_iterator
it=parsed_argv.begin(); it!=parsed_argv.end(); it++)
if(it->is_infile_name)
return true;
return false;
}
bool have_infile_arg() const;

std::string stdin_file;

Expand Down
4 changes: 2 additions & 2 deletions src/goto-cc/goto_cc_mode.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ Date: June 2006
class goto_cc_modet:public messaget
{
public:
virtual int main(int argc, const char **argv);
int main(int argc, const char **argv);
virtual int doit()=0;
virtual void help_mode()=0;
virtual void help();
void help();
virtual void usage_error();

goto_cc_modet(
Expand Down
1 change: 1 addition & 0 deletions unit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ target_link_libraries(
testing-utils
ansi-c
solvers
goto-cc-lib
goto-checker
goto-programs
goto-instrument-lib
Expand Down
3 changes: 3 additions & 0 deletions unit/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ SRC += analyses/ai/ai.cpp \
big-int/big-int.cpp \
compound_block_locations.cpp \
get_goto_model_from_c_test.cpp \
goto-cc/armcc_cmdline.cpp \
goto-checker/report_util/is_property_less_than.cpp \
goto-instrument/cover_instrument.cpp \
goto-instrument/cover/cover_only.cpp \
Expand Down Expand Up @@ -162,6 +163,8 @@ testing-utils-clean:
BMC_DEPS =../src/cbmc/c_test_input_generator$(OBJEXT) \
../src/cbmc/cbmc_languages$(OBJEXT) \
../src/cbmc/cbmc_parse_options$(OBJEXT) \
../src/goto-cc/armcc_cmdline$(OBJEXT) \
../src/goto-cc/goto_cc_cmdline$(OBJEXT) \
../src/goto-instrument/source_lines$(OBJEXT) \
../src/goto-instrument/cover$(OBJEXT) \
../src/goto-instrument/cover_basic_blocks$(OBJEXT) \
Expand Down
34 changes: 34 additions & 0 deletions unit/goto-cc/armcc_cmdline.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/// \file
/// Unit tests of src/goto-cc/armcc_cmdline.cpp
/// \author Diffblue Ltd.

#include <testing-utils/use_catch.h>

#include <util/optional.h>

#include <string>
#include <vector>

optionalt<std::string>
prefix_in_list(const std::string &option, const std::vector<std::string> &list);

static const std::vector<std::string> test_list{"spam", "eggs", "and", "ham"};

TEST_CASE("prefix_in_list exact match", "[core][armcc_cmdline][prefix_in_list]")
{
REQUIRE(*prefix_in_list("spam", test_list) == "spam");
REQUIRE(*prefix_in_list("ham", test_list) == "ham");
}

TEST_CASE(
"prefix_in_list match prefix",
"[core][armcc_cmdline][prefix_in_list]")
{
REQUIRE(*prefix_in_list("sp", test_list) == "spam");
REQUIRE(*prefix_in_list("ha", test_list) == "ham");
}

TEST_CASE("prefix_in_list unmatched", "[core][armcc_cmdline][prefix_in_list]")
{
REQUIRE_FALSE(prefix_in_list("foobar", test_list));
}
3 changes: 3 additions & 0 deletions unit/goto-cc/module_dependencies.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
goto-cc
testing-utils
util