cprover
armcc_mode.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: Command line option container
4 
5 Author: CM Wintersteiger, 2006
6 
7 \*******************************************************************/
8 
11 
12 #include "armcc_mode.h"
13 
14 #ifdef _WIN32
15 #define EX_OK 0
16 #define EX_USAGE 64
17 #define EX_SOFTWARE 70
18 #else
19 #include <sysexits.h>
20 #endif
21 
22 #include <iostream>
23 
24 #include <util/message.h>
25 #include <util/prefix.h>
26 #include <util/config.h>
27 
28 #include "compile.h"
29 
32 {
33  if(cmdline.isset('?') || cmdline.isset("help"))
34  {
35  help();
36  return EX_OK;
37  }
38 
39  compilet compiler(cmdline, message_handler, cmdline.isset("diag_error="));
40 
41  #if 0
42  bool act_as_ld=
43  has_prefix(base_name, "ld") ||
44  has_prefix(base_name, "goto-ld") ||
45  has_prefix(base_name, "link") ||
46  has_prefix(base_name, "goto-link");
47  #endif
48 
49  const auto verbosity = messaget::eval_verbosity(
51 
53  log.debug() << "ARM mode" << messaget::eom;
54 
55  // model validation
56  compiler.validate_goto_model = cmdline.isset("validate-goto-model");
57 
58  // get configuration
60 
62  config.ansi_c.arch="arm";
63 
64  // determine actions to be taken
65 
66  if(cmdline.isset('E'))
68  else if(cmdline.isset('c') || cmdline.isset('S'))
70  else
72 
73  if(cmdline.isset('U'))
75 
76  if(cmdline.isset('L'))
77  compiler.library_paths=cmdline.get_values('L');
78  // Don't add the system paths!
79 
80  // these take precedence over -I
81  if(cmdline.isset('J'))
82  {
83  const std::list<std::string> &values=
84  cmdline.get_values('J');
85 
86  for(std::list<std::string>::const_iterator
87  it=values.begin();
88  it!=values.end();
89  it++)
90  config.ansi_c.preprocessor_options.push_back("-J"+*it);
91  }
92 
93  if(cmdline.isset("preinclude="))
94  {
95  const std::list<std::string> &values=
96  cmdline.get_values("preinclude=");
97 
98  for(std::list<std::string>::const_iterator
99  it=values.begin();
100  it!=values.end();
101  it++)
102  config.ansi_c.preprocessor_options.push_back("--preinclude="+*it);
103  }
104 
105  // armcc's default is .o
106  if(cmdline.isset("default_extension="))
107  compiler.object_file_extension=
108  cmdline.get_value("default_extension=");
109  else
110  compiler.object_file_extension="o";
111 
112  // note that ARM's default is "unsigned_chars",
113  // in contrast to gcc's default!
114  if(cmdline.isset("signed_chars"))
116  else
118 
119  // ARM's default is 16 bits for wchar_t
120  if(cmdline.isset("wchar32"))
122  else
124 
125  if(cmdline.isset('o'))
126  {
127  // given goto-armcc -o file1 -o file2, we output to file2, not file1
128  compiler.output_file_object=cmdline.get_values('o').back();
129  compiler.output_file_executable=cmdline.get_values('o').back();
130  }
131  else
132  {
133  compiler.output_file_object.clear();
134  compiler.output_file_executable="a.out";
135  }
136 
137  if(verbosity > messaget::M_STATISTICS)
138  {
139  std::list<std::string>::iterator it;
140 
141  std::cout << "Defines:\n";
142  for(it=config.ansi_c.defines.begin();
143  it!=config.ansi_c.defines.end();
144  it++)
145  {
146  std::cout << " " << (*it) << '\n';
147  }
148 
149  std::cout << "Undefines:\n";
150  for(it=config.ansi_c.undefines.begin();
151  it!=config.ansi_c.undefines.end();
152  it++)
153  {
154  std::cout << " " << (*it) << '\n';
155  }
156 
157  std::cout << "Preprocessor Options:\n";
158  for(it=config.ansi_c.preprocessor_options.begin();
160  it++)
161  {
162  std::cout << " " << (*it) << '\n';
163  }
164 
165  std::cout << "Include Paths:\n";
166  for(it=config.ansi_c.include_paths.begin();
167  it!=config.ansi_c.include_paths.end();
168  it++)
169  {
170  std::cout << " " << (*it) << '\n';
171  }
172 
173  std::cout << "Library Paths:\n";
174  for(it=compiler.library_paths.begin();
175  it!=compiler.library_paths.end();
176  it++)
177  {
178  std::cout << " " << (*it) << '\n';
179  }
180 
181  std::cout << "Output file (object): "
182  << compiler.output_file_object << '\n';
183  std::cout << "Output file (executable): "
184  << compiler.output_file_executable << '\n';
185  }
186 
187  // Parse input program, convert to goto program, write output
188  return compiler.doit() ? EX_USAGE : EX_OK;
189 }
190 
193 {
194  std::cout << "goto-armcc understands the options "
195  << "of armcc plus the following.\n\n";
196 }
messaget
Class that provides messages with a built-in verbosity 'level'.
Definition: message.h:155
configt::ansi_ct::defines
std::list< std::string > defines
Definition: config.h:202
cmdlinet::isset
virtual bool isset(char option) const
Definition: cmdline.cpp:29
configt::ansi_ct::wchar_t_width
std::size_t wchar_t_width
Definition: config.h:121
configt::ansi_ct::include_paths
std::list< std::string > include_paths
Definition: config.h:205
messaget::M_STATISTICS
@ M_STATISTICS
Definition: message.h:171
compilet::COMPILE_ONLY
@ COMPILE_ONLY
Definition: compile.h:34
prefix.h
compilet::doit
bool doit()
reads and source and object files, compiles and links them into goto program objects.
Definition: compile.cpp:58
compilet::COMPILE_LINK_EXECUTABLE
@ COMPILE_LINK_EXECUTABLE
Definition: compile.h:38
goto_cc_modet::base_name
const std::string base_name
Definition: goto_cc_mode.h:38
messaget::eom
static eomt eom
Definition: message.h:297
configt::ansi_ct::undefines
std::list< std::string > undefines
Definition: config.h:203
configt::ansi_c
struct configt::ansi_ct ansi_c
configt::ansi_ct::flavourt::ARM
@ ARM
compilet::validate_goto_model
bool validate_goto_model
Definition: compile.h:31
armcc_modet::doit
int doit() final
does it.
Definition: armcc_mode.cpp:31
armcc_mode.h
Base class for command line interpretation for CL.
armcc_modet::help_mode
void help_mode() final
display command line help
Definition: armcc_mode.cpp:192
compilet::output_file_object
std::string output_file_object
Definition: compile.h:50
armcc_modet::cmdline
armcc_cmdlinet & cmdline
Definition: armcc_mode.h:36
has_prefix
bool has_prefix(const std::string &s, const std::string &prefix)
Definition: converter.cpp:13
compilet::output_file_executable
std::string output_file_executable
Definition: compile.h:47
messaget::M_ERROR
@ M_ERROR
Definition: message.h:170
cmdlinet::get_value
std::string get_value(char option) const
Definition: cmdline.cpp:47
compilet::library_paths
std::list< std::string > library_paths
Definition: compile.h:41
compile.h
Compile and link source and object files.
configt::ansi_ct::arch
irep_idt arch
Definition: config.h:165
compilet::object_file_extension
std::string object_file_extension
Definition: compile.h:46
configt::ansi_ct::preprocessor_options
std::list< std::string > preprocessor_options
Definition: config.h:204
config
configt config
Definition: config.cpp:24
compilet::PREPROCESS_ONLY
@ PREPROCESS_ONLY
Definition: compile.h:33
configt::ansi_ct::mode
flavourt mode
Definition: config.h:196
compilet::mode
enum compilet::@4 mode
configt::set
bool set(const cmdlinet &cmdline)
Definition: config.cpp:797
config.h
configt::ansi_ct::char_is_unsigned
bool char_is_unsigned
Definition: config.h:124
armcc_modet::message_handler
gcc_message_handlert message_handler
Definition: armcc_mode.h:37
goto_cc_modet::help
void help()
display command line help
Definition: goto_cc_mode.cpp:46
compilet
Definition: compile.h:27
messaget::eval_verbosity
static unsigned eval_verbosity(const std::string &user_input, const message_levelt default_verbosity, message_handlert &dest)
Parse a (user-)provided string as a verbosity level and set it as the verbosity of dest.
Definition: message.cpp:104
message.h
cmdlinet::get_values
const std::list< std::string > & get_values(const std::string &option) const
Definition: cmdline.cpp:108