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