cprover
goto_cc_main.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module: GOTO-CC Main Module
4 
5 Authors: Daniel Kroening, kroening@kroening.com
6 
7 Date: May 2006
8 
9 \*******************************************************************/
10 
13 
14 #include <algorithm>
15 #include <iostream>
16 
17 #include <util/unicode.h>
18 #include <util/get_base_name.h>
19 
20 #include "armcc_cmdline.h"
21 #include "as86_cmdline.h"
22 #include "as_cmdline.h"
23 #include "bcc_cmdline.h"
24 #include "gcc_cmdline.h"
25 #include "ld_cmdline.h"
26 #include "ms_cl_cmdline.h"
27 #include "ms_link_cmdline.h"
28 
29 #include "armcc_mode.h"
30 #include "as_mode.h"
31 #include "cw_mode.h"
32 #include "gcc_mode.h"
33 #include "ld_mode.h"
34 #include "ms_cl_mode.h"
35 #include "ms_link_mode.h"
36 
37 std::string to_lower_string(const std::string &s)
38 {
39  std::string result=s;
40  transform(result.begin(), result.end(), result.begin(), tolower);
41  return result;
42 }
43 
44 #ifdef _MSC_VER
45 int wmain(int argc, const wchar_t **argv_wide)
46 #else
47 int main(int argc, const char **argv)
48 #endif
49 {
50  #ifdef _MSC_VER
51  auto vec=narrow_argv(argc, argv_wide);
52  auto narrow=to_c_str_array(std::begin(vec), std::end(vec));
53  auto argv=narrow.data();
54  #endif
55 
56  if(argv==nullptr || argc<1)
57  {
58  std::cerr << "failed to determine base name\n";
59  return 1;
60  }
61 
62  #ifdef _MSC_VER
63  // we do 'to_lower_string' because of Windows
64  std::string base_name=
65  to_lower_string(get_base_name(argv[0], true));
66  #else
67  std::string base_name=get_base_name(argv[0], false);
68  #endif
69 
70  if(base_name == "goto-cl" || base_name == "cl")
71  {
72  // this is the Visual Studio CL personality
73  ms_cl_cmdlinet cmdline;
74  cmdline.parse_env();
75  ms_cl_modet ms_cl_mode(cmdline, base_name);
76  return ms_cl_mode.main(argc, argv);
77  }
78  else if(base_name == "goto-link" || base_name == "link")
79  {
80  // this is the Visual Studio LINK personality
81  ms_link_cmdlinet cmdline;
82  ms_link_modet ms_link_mode(cmdline);
83  return ms_link_mode.main(argc, argv);
84  }
85  else if(base_name=="goto-cw" ||
86  base_name=="goto-cw-link")
87  {
88  // this is the CodeWarrior personality,
89  // but we use the gcc command line interface
90  gcc_cmdlinet cmdline;
91  cw_modet cw_mode(cmdline, base_name);
92  return cw_mode.main(argc, argv);
93  }
94  else if(base_name=="goto-armcc" ||
95  base_name=="goto-armlink")
96  {
97  // this is the armcc personality
98  armcc_cmdlinet cmdline;
99  armcc_modet armcc_mode(cmdline, base_name);
100  return armcc_mode.main(argc, argv);
101  }
102  // handle GCC names like x86_64-apple-darwin14-llvm-gcc-4.2
103  // via x86_64-apple-darwin14-llvm-goto-gcc-4.2
104  else if(base_name=="goto-clang" ||
105  base_name.find("goto-gcc")!=std::string::npos)
106  {
107  // this produces ELF/Mach-O "hybrid binaries",
108  // with a GCC-style command-line interface,
109  // but also disables CPROVER language extensions
110  gcc_cmdlinet cmdline;
111  gcc_modet gcc_mode(cmdline, base_name, true);
112  return gcc_mode.main(argc, argv);
113  }
114  else if(base_name.find("goto-ld")!=std::string::npos)
115  {
116  // this simulates "ld" for linking
117  ld_cmdlinet cmdline;
118  ld_modet ld_mode(cmdline, base_name);
119  return ld_mode.main(argc, argv);
120  }
121  else if(base_name.find("goto-bcc")!=std::string::npos)
122  {
123  // this simulates Bruce's C Compiler
124  bcc_cmdlinet cmdline;
125  // bcc does not build ELF objects -- hybrid mode is used
126  // with -S only
127  gcc_modet gcc_mode(cmdline, base_name, true);
128  return gcc_mode.main(argc, argv);
129  }
130  else if(base_name.find("goto-as86")!=std::string::npos)
131  {
132  // assembler used by Bruce's C Compiler
133  as86_cmdlinet cmdline;
134  // as86 does not build ELF objects, no hybrid binaries
135  as_modet as_mode(cmdline, base_name, false);
136  return as_mode.main(argc, argv);
137  }
138  else if(base_name.find("goto-as")!=std::string::npos)
139  {
140  // GNU assembler
141  as_cmdlinet cmdline;
142  as_modet as_mode(cmdline, base_name, true);
143  return as_mode.main(argc, argv);
144  }
145  else
146  {
147  // the default personality is GCC-style
148  gcc_cmdlinet cmdline;
149  gcc_modet gcc_mode(cmdline, base_name, false);
150  return gcc_mode.main(argc, argv);
151  }
152 }
std::string narrow(const wchar_t *s)
Definition: unicode.cpp:21
A special command line object for Bruce&#39;s C Compiler Author: Michael Tautschnig Date: July 2016...
A special command line object for the gcc-like options.
virtual int main(int argc, const char **argv)
starts the compiler
std::string to_lower_string(const std::string &s)
int main(int argc, const char **argv)
Assembler Mode.
Base class for command line interpretation.
Base class for command line interpretation.
A special command line object for the ld-like options.
std::string get_base_name(const std::string &in, bool strip_suffix)
cleans a filename from path and extension
Visual Studio CL Mode.
A special command line object for GNU Assembler Author: Michael Tautschnig Date: July 2016...
std::vector< std::string > narrow_argv(int argc, const wchar_t **argv_wide)
Definition: unicode.cpp:146
Base class for command line interpretation for CL.
std::vector< const char * > to_c_str_array(It b, It e)
Definition: unicode.h:35
A special command line object for the gcc-like options.
Base class for command line interpretation.
A special command line object for as86 (of Bruce&#39;s C Compiler) Author: Michael Tautschnig Date: July ...
A special command line object to mimic ARM&#39;s armcc.