~ubuntu-branches/ubuntu/hardy/codeblocks/hardy-backports

« back to all changes in this revision

Viewing changes to src/plugins/compilergcc/compilerGNUTRICORE.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Michael Casadevall
  • Date: 2008-07-17 04:39:23 UTC
  • Revision ID: james.westby@ubuntu.com-20080717043923-gmsy5cwkdjswghkm
Tags: upstream-8.02
ImportĀ upstreamĀ versionĀ 8.02

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * This file is part of the Code::Blocks IDE and licensed under the GNU General Public License, version 3
 
3
 * http://www.gnu.org/licenses/gpl-3.0.html
 
4
 *
 
5
 * $Revision$
 
6
 * $Id$
 
7
 * $HeadURL$
 
8
 */
 
9
 
 
10
#include <sdk.h>
 
11
#include <prep.h>
 
12
#ifndef CB_PRECOMP
 
13
    #include <wx/intl.h>
 
14
    #include <wx/regex.h>
 
15
    #include <wx/utils.h> // wxGetOSDirectory, wxGetEnv
 
16
#endif
 
17
#include <wx/filefn.h> // wxFileExists
 
18
#include <wx/fileconf.h> // wxFileConfig
 
19
#ifdef __WXMSW__
 
20
#include <wx/msw/registry.h>
 
21
#endif // __WXMSW__
 
22
#include "compilerGNUTRICORE.h"
 
23
 
 
24
CompilerGNUTRICORE::CompilerGNUTRICORE()
 
25
        : Compiler(_("GNU GCC Compiler for TriCore"),_T("tricore-gcc"))
 
26
{
 
27
    Reset();
 
28
}
 
29
 
 
30
CompilerGNUTRICORE::~CompilerGNUTRICORE()
 
31
{
 
32
    //dtor
 
33
}
 
34
 
 
35
Compiler * CompilerGNUTRICORE::CreateCopy()
 
36
{
 
37
    Compiler* c = new CompilerGNUTRICORE(*this);
 
38
    c->SetExtraPaths(m_ExtraPaths); // wxArrayString doesn't seem to be copied with the default copy ctor...
 
39
    return c;
 
40
}
 
41
 
 
42
void CompilerGNUTRICORE::Reset()
 
43
{
 
44
    if (platform::windows)
 
45
    {
 
46
        m_Programs.C = _T("tricore-gcc.exe");
 
47
        m_Programs.CPP = _T("tricore-g++.exe");
 
48
        m_Programs.LD = _T("tricore-g++.exe");
 
49
        m_Programs.DBG = _T("tricore-insight.exe");
 
50
        m_Programs.LIB = _T("tricore-ar.exe");
 
51
        m_Programs.WINDRES = _T("");
 
52
        m_Programs.MAKE = _T("make.exe");
 
53
    }
 
54
    else
 
55
    {
 
56
        m_Programs.C = _T("tricore-gcc");
 
57
        m_Programs.CPP = _T("tricore-g++");
 
58
        m_Programs.LD = _T("tricore-g++");
 
59
        m_Programs.DBG = _T("tricore-insight");
 
60
        m_Programs.LIB = _T("tricore-ar");
 
61
        m_Programs.WINDRES = _T("");
 
62
        m_Programs.MAKE = _T("make");
 
63
    }
 
64
    m_Switches.includeDirs = _T("-I");
 
65
    m_Switches.libDirs = _T("-L");
 
66
    m_Switches.linkLibs = _T("-l");
 
67
    m_Switches.defines = _T("-D");
 
68
    m_Switches.genericSwitch = _T("-");
 
69
    m_Switches.objectExtension = _T("o");
 
70
    m_Switches.needDependencies = true;
 
71
    m_Switches.forceCompilerUseQuotes = false;
 
72
    m_Switches.forceLinkerUseQuotes = false;
 
73
    m_Switches.logging = clogFull;
 
74
    m_Switches.libPrefix = _T("lib");
 
75
    m_Switches.libExtension = _T("a");
 
76
    m_Switches.linkerNeedsLibPrefix = false;
 
77
    m_Switches.linkerNeedsLibExtension = false;
 
78
 
 
79
    // Summary of GCC options: http://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
 
80
 
 
81
    m_Options.ClearOptions();
 
82
    m_Options.AddOption(_("Produce debugging symbols"),
 
83
                        _T("-g"),
 
84
                        _("Debugging"),
 
85
                        _T(""),
 
86
                        true,
 
87
                        _T("-O -O1 -O2 -O3 -Os"),
 
88
                        _("You have optimizations enabled. This will make debugging difficult because variables may be optimized away etc."));
 
89
    wxString gprof_link = _T("-pg");
 
90
    if (platform::windows)
 
91
        gprof_link = _T("-pg -lgmon");
 
92
    m_Options.AddOption(_("Profile code when executed"), _T("-pg"), _("Profiling"), gprof_link);
 
93
 
 
94
    wxString category = _("Warnings");
 
95
 
 
96
    // warnings
 
97
    m_Options.AddOption(_("In C mode, support all ISO C90 programs. In C++ mode, remove GNU extensions that conflict with ISO C++"), _T("-ansi"), category);
 
98
    m_Options.AddOption(_("Enable all compiler warnings (overrides every other setting)"), _T("-Wall"), category);
 
99
    m_Options.AddOption(_("Enable standard compiler warnings"), _T("-W"), category);
 
100
    m_Options.AddOption(_("Stop compiling after first error"), _T("-Wfatal-errors"), category);
 
101
    m_Options.AddOption(_("Inhibit all warning messages"), _T("-w"), category);
 
102
    m_Options.AddOption(_("Enable warnings demanded by strict ISO C and ISO C++"), _T("-pedantic"), category);
 
103
    m_Options.AddOption(_("Treat as errors the warnings demanded by strict ISO C and ISO C++"), _T("-pedantic-errors"), category);
 
104
    m_Options.AddOption(_("Warn if main() is not conformant"), _T("-Wmain"), category);
 
105
 
 
106
    category = _("General Options");
 
107
 
 
108
    // general options
 
109
    m_Options.AddOption(_("Output an error if same variable is declared without extern in different modules"), _T("-fno-common"), category);
 
110
    m_Options.AddOption(_("Do not allocate to an enum type only as many bytes as it needs for the declared range of possible values"), _T("-fno-short-enums"), category);
 
111
    m_Options.AddOption(_("Save intermediate files in the build directory"), _T("-save-temps"), category);
 
112
 
 
113
    // Startup options
 
114
    category = _("Linker and startup code");
 
115
    m_Options.AddOption(_("do not link against the default crt0.o, so you can add your own startup code (TriCore specific)"), _T("-nocrt0"), category);
 
116
    m_Options.AddOption(_("do not link against standard system startup files"), _T("-nostartfiles"), category);
 
117
    m_Options.AddOption(_("only search library directories explicitly specified on the command line"), _T("-nostdlib"), category);
 
118
 
 
119
    // optimization
 
120
    category = _("Optimization");
 
121
    m_Options.AddOption(_("Strip all symbols from binary (minimizes size)"), _T(""), category, _T("-s"), true, _T("-g -ggdb"), _("Stripping the binary will strip debugging symbols as well!"));
 
122
    m_Options.AddOption(_("Optimize generated code (for speed)"), _T("-O"), category);
 
123
    m_Options.AddOption(_("Optimize more (for speed)"), _T("-O1"), category);
 
124
    m_Options.AddOption(_("Optimize even more (for speed)"), _T("-O2"), category);
 
125
    m_Options.AddOption(_("Optimize fully (for speed)"), _T("-O3"), category);
 
126
    m_Options.AddOption(_("Optimize generated code (for size)"), _T("-Os"), category);
 
127
    m_Options.AddOption(_("Expensive optimizations"), _T("-fexpensive-optimizations"), category);
 
128
    m_Options.AddOption(_("No instruction scheduling before reload"), _T("-fno-schedule-insns"), category);
 
129
    m_Options.AddOption(_("No instruction scheduling after reload"), _T("-fno-schedule-insns2"), category);
 
130
 
 
131
    // machine dependent options
 
132
    category = _("TriCore achitecture specific");
 
133
 
 
134
    m_Options.AddOption(_("jump tables in text section"), _T("-mjumptable-in-textsection"), category);
 
135
    m_Options.AddOption(_("include C source lines into assembler output"), _T("-masm-source-lines"), category);
 
136
    m_Options.AddOption(_("base relative addresses for small data objects"), _T("-msmall-pid"), category);
 
137
    m_Options.AddOption(_("allow _bit in structures and unions"), _T("-mbits-struct-unions"), category);
 
138
    m_Options.AddOption(_("allow callee and caller in different sections"), _T("-mnocallerrors"), category);
 
139
    m_Options.AddOption(_("allocate data in aligned section"), _T("-maligned-data-sections"), category);
 
140
    m_Options.AddOption(_("enable attribute alignedaccess"), _T("-maligned-access"), category);
 
141
    m_Options.AddOption(_("use optimized single float emulation"), _T("-moptfp"), category);
 
142
    m_Options.AddOption(_("layout bitfields EABI conform"), _T("-meabi-bitfields"), category);
 
143
    m_Options.AddOption(_("EABI conform"), _T("-meabi"), category);
 
144
 
 
145
    // machine dependent options
 
146
    category = _("TriCore MCU derivatives");
 
147
 
 
148
    m_Options.AddOption(_("TriCore TC1130"), _T("-mcpu=tc1130"), category);
 
149
    m_Options.AddOption(_("TriCore TC1130 BA step"), _T("-mcpu=tc1130ba"), category);
 
150
    m_Options.AddOption(_("TriCore TC1161"), _T("-mcpu=tc1161"), category);
 
151
    m_Options.AddOption(_("TriCore TC1162"), _T("-mcpu=tc1162"), category);
 
152
    m_Options.AddOption(_("TriCore TC1762"), _T("-mcpu=tc1762"), category);
 
153
    m_Options.AddOption(_("TriCore TC1765"), _T("-mcpu=tc1765"), category);
 
154
    m_Options.AddOption(_("TriCore TC1766"), _T("-mcpu=tc1766"), category);
 
155
    m_Options.AddOption(_("TriCore TC1775"), _T("-mcpu=tc1775"), category);
 
156
    m_Options.AddOption(_("TriCore TC1792"), _T("-mcpu=tc1792"), category);
 
157
    m_Options.AddOption(_("TriCore TC1796"), _T("-mcpu=tc1796"), category);
 
158
    m_Options.AddOption(_("TriCore TC1920"), _T("-mcpu=tc1920"), category);
 
159
 
 
160
    m_Commands[(int)ctCompileObjectCmd].push_back(CompilerTool(_T("$compiler $options $includes -c $file -o $object")));
 
161
    m_Commands[(int)ctGenDependenciesCmd].push_back(CompilerTool(_T("$compiler -MM $options -MF $dep_object -MT $object $includes $file")));
 
162
    m_Commands[(int)ctCompileResourceCmd].push_back(CompilerTool(_T("$rescomp -i $file -J rc -o $resource_output -O coff $res_includes")));
 
163
    m_Commands[(int)ctLinkConsoleExeCmd].push_back(CompilerTool(_T("$linker $libdirs -o $exe_output $link_objects $link_resobjects $link_options $libs")));
 
164
    if (platform::windows)
 
165
    {
 
166
        m_Commands[(int)ctLinkExeCmd].push_back(CompilerTool(_T("$linker $libdirs -o $exe_output $link_objects $link_resobjects $link_options $libs -mwindows")));
 
167
        m_Commands[(int)ctLinkDynamicCmd].push_back(CompilerTool(_T("$linker -shared -Wl,--output-def=$def_output -Wl,--out-implib=$static_output -Wl,--dll $libdirs $link_objects $link_resobjects -o $exe_output $link_options $libs")));
 
168
    }
 
169
    else
 
170
    {
 
171
        m_Commands[(int)ctLinkExeCmd] = m_Commands[(int)ctLinkConsoleExeCmd]; // no -mwindows
 
172
        m_Commands[(int)ctLinkDynamicCmd].push_back(CompilerTool(_T("$linker -shared $libdirs $link_objects $link_resobjects -o $exe_output $link_options $libs")));
 
173
    }
 
174
    m_Commands[(int)ctLinkStaticCmd].push_back(CompilerTool(_T("$lib_linker -rs $static_output $link_objects")));
 
175
    m_Commands[(int)ctLinkNativeCmd] = m_Commands[(int)ctLinkConsoleExeCmd]; // unsupported currently
 
176
 
 
177
    LoadDefaultRegExArray();
 
178
 
 
179
    m_CompilerOptions.Clear();
 
180
    m_LinkerOptions.Clear();
 
181
    m_LinkLibs.Clear();
 
182
    m_CmdsBefore.Clear();
 
183
    m_CmdsAfter.Clear();
 
184
}
 
185
 
 
186
void CompilerGNUTRICORE::LoadDefaultRegExArray()
 
187
{
 
188
    m_RegExes.Clear();
 
189
    m_RegExes.Add(RegExStruct(_("Fatal error"), cltError, _T("FATAL:[ \t]*(.*)"), 1));
 
190
    m_RegExes.Add(RegExStruct(_("'In function...' info"), cltInfo, _T("(") + FilePathWithSpaces + _T("):[ \t]+") + _T("([iI]n ([cC]lass|[cC]onstructor|[dD]estructor|[fF]unction|[mM]ember [fF]unction).*)"), 2, 1));
 
191
    m_RegExes.Add(RegExStruct(_("'Instantiated from' info"), cltInfo, _T("(") + FilePathWithSpaces + _T("):([0-9]+):[ \t]+([iI]nstantiated from .*)"), 3, 1, 2));
 
192
    m_RegExes.Add(RegExStruct(_("Resource compiler error"), cltError, _T("windres.exe:[ \t](") + FilePathWithSpaces + _T("):([0-9]+):[ \t](.*)"), 3, 1, 2));
 
193
    m_RegExes.Add(RegExStruct(_("Resource compiler error (2)"), cltError, _T("windres.exe:[ \t](.*)"), 1));
 
194
    m_RegExes.Add(RegExStruct(_("Preprocessor warning"), cltWarning, _T("(") + FilePathWithSpaces + _T("):([0-9]+):([0-9]+):[ \t]([Ww]arning:[ \t].*)"), 4, 1, 2));
 
195
    m_RegExes.Add(RegExStruct(_("Preprocessor error"), cltError, _T("(") + FilePathWithSpaces + _T("):([0-9]+):[0-9]+:[ \t](.*)"), 3, 1, 2));
 
196
    m_RegExes.Add(RegExStruct(_("Compiler note"), cltInfo, _T("(") + FilePathWithSpaces + _T("):([0-9]+):[ \t]([Nn]ote:[ \t].*)"), 3, 1, 2));
 
197
    m_RegExes.Add(RegExStruct(_("General note"), cltInfo, _T("([Nn]ote:[ \t].*)"), 1));
 
198
    m_RegExes.Add(RegExStruct(_("Compiler warning"), cltWarning, _T("(") + FilePathWithSpaces + _T("):([0-9]+):[ \t]([Ww]arning:[ \t].*)"), 3, 1, 2));
 
199
    m_RegExes.Add(RegExStruct(_("Compiler error"), cltError, _T("(") + FilePathWithSpaces + _T("):([0-9]+):[ \t](.*)"), 3, 1, 2));
 
200
    m_RegExes.Add(RegExStruct(_("Linker error"), cltError, _T("(") + FilePathWithSpaces + _T("):([0-9]+):[0-9]+:[ \t](.*)"), 3, 1, 2));
 
201
    m_RegExes.Add(RegExStruct(_("Linker error (2)"), cltError, FilePathWithSpaces + _T("\\(.text\\+[0-9A-Za-z]+\\):([ \tA-Za-z0-9_:+/\\.-]+):[ \t](.*)"), 2, 1));
 
202
    m_RegExes.Add(RegExStruct(_("Linker error (lib not found)"), cltError, _T(".*(ld.*):[ \t](cannot find.*)"), 2, 1));
 
203
    m_RegExes.Add(RegExStruct(_("Undefined reference"), cltError, _T("(") + FilePathWithSpaces + _T("):[ \t](undefined reference.*)"), 2, 1));
 
204
    m_RegExes.Add(RegExStruct(_("General warning"), cltWarning, _T("([Ww]arning:[ \t].*)"), 1));
 
205
    m_RegExes.Add(RegExStruct(_("Auto-import info"), cltInfo, _T("([Ii]nfo:[ \t].*)\\(auto-import\\)"), 1));
 
206
}
 
207
 
 
208
AutoDetectResult CompilerGNUTRICORE::AutoDetectInstallationDir()
 
209
{
 
210
    wxString sep = wxFileName::GetPathSeparator();
 
211
#ifdef __WXMSW__
 
212
    m_MasterPath = _T("C:\\HighTec\\TriCore"); // just a guess
 
213
 
 
214
    //    wxLogNull ln;
 
215
    wxRegKey key; // defaults to HKCR
 
216
    key.SetName(_T("HKEY_LOCAL_MACHINE\\Software\\HighTec EDV-Systeme\\TriCore\\"));
 
217
    if (key.Exists() && key.Open(wxRegKey::Read))
 
218
    {
 
219
     // found; read it
 
220
        if (key.HasValue(_T("InstallPath")))
 
221
        {
 
222
                key.QueryValue(_T("InstallPath"), m_MasterPath);
 
223
        }
 
224
     }
 
225
#else
 
226
        m_MasterPath = _T("/usr/local/tricore");
 
227
#endif // __WXMSW__
 
228
    AutoDetectResult ret = wxFileExists(m_MasterPath + sep + _T("bin") + sep + m_Programs.C) ? adrDetected : adrGuessed;
 
229
    if (ret == adrDetected)
 
230
    {
 
231
          AddIncludeDir(m_MasterPath + sep + _T("tricore") + sep + _T("include"));
 
232
    }
 
233
    return ret;
 
234
}