00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "asminfo.h"
00012 #include "languagemanager.h"
00013 #include "logview.h"
00014 #include "microinfo.h"
00015 #include "microlibrary.h"
00016 #include "sdcc.h"
00017 #include "src/core/ktlconfig.h"
00018
00019 #include <klocale.h>
00020 #include <kmessagebox.h>
00021 #include <kprocess.h>
00022
00023 SDCC::SDCC( ProcessChain * processChain, KTechlab * parent )
00024 : ExternalLanguage( processChain, parent, "SDCC" )
00025 {
00026 m_successfulMessage = i18n("*** Compilation successful ***");
00027 m_failedMessage = i18n("*** Compilation failed ***");
00028 }
00029
00030
00031 SDCC::~SDCC()
00032 {
00033 }
00034
00035
00036 void SDCC::processInput( ProcessOptions options )
00037 {
00038 resetLanguageProcess();
00039
00040 MicroInfo * info = MicroLibrary::self()->microInfoWithID( options.m_picID );
00041 if (!info)
00042 {
00043 outputError( i18n("Could not find PIC with ID \"%1\".").arg(options.m_picID) );
00044 return;
00045 }
00046
00047 m_processOptions = options;
00048
00049 *m_languageProcess << ("sdcc");
00050
00051
00052
00053 #define ARG(text,option) if ( KTLConfig::text() ) *m_languageProcess << ( QString("--%1").arg(option) );
00054
00055 ARG( sDCC_nostdlib, "nostdlib" )
00056 ARG( sDCC_nostdinc, "nostdinc" )
00057 ARG( sDCC_less_pedantic, "less-pedantic" )
00058 ARG( sDCC_std_c89, "std-c89" )
00059 ARG( sDCC_std_c99, "std-c99" )
00060
00061
00062 ARG( sDCC_stack_auto, "stack-auto" )
00063 ARG( sDCC_int_long_reent, "int-long-reent" )
00064 ARG( sDCC_float_reent, "float-reent" )
00065 ARG( sDCC_fommit_frame_pointer, "fommit-frame-pointer" )
00066 ARG( sDCC_no_xinit_opt, "no-xinit-opt" )
00067 ARG( sDCC_all_callee_saves, "all-callee-saves" )
00068
00069
00070 ARG( sDCC_nooverlay, "nooverlay" )
00071 ARG( sDCC_nogcse, "nogcse" )
00072 ARG( sDCC_nolabelopt, "nolabelopt" )
00073 ARG( sDCC_noinvariant, "noinvariant" )
00074 ARG( sDCC_noinduction, "noinduction" )
00075 ARG( sDCC_no_peep, "no-peep" )
00076 ARG( sDCC_noloopreverse, "noloopreverse" )
00077 ARG( sDCC_opt_code_size, "opt-code-size" )
00078 ARG( sDCC_opt_code_speed, "opt-code-speed" )
00079 ARG( sDCC_peep_asm, "peep-asm" )
00080 ARG( sDCC_nojtbound, "nojtbound" )
00081
00082
00083 if ( info->instructionSet()->set() == AsmInfo::PIC16 )
00084 {
00085 ARG( sDCC_nodefaultlibs, "nodefaultlibs" )
00086 ARG( sDCC_pno_banksel, "pno-banksel" )
00087 ARG( sDCC_pstack_model_large, "pstack-model=large" )
00088 ARG( sDCC_debug_xtra, "debug-xtra" )
00089 ARG( sDCC_denable_peeps, "denable-peeps" )
00090 ARG( sDCC_calltree, "calltree" )
00091 ARG( sDCC_fstack, "fstack" )
00092 ARG( sDCC_optimize_goto, "optimize-goto" )
00093 ARG( sDCC_optimize_cmp, "optimize-cmp" )
00094 ARG( sDCC_optimize_df, "optimize-df" )
00095 }
00096 #undef ARG
00097
00098 if ( !KTLConfig::miscSDCCOptions().isEmpty() )
00099 *m_languageProcess << ( KTLConfig::miscSDCCOptions() );
00100
00101
00102
00103 *m_languageProcess << ("--debug");
00104 *m_languageProcess << ("-S");
00105
00106 QString asmSwitch;
00107 switch ( info->instructionSet()->set() )
00108 {
00109 case AsmInfo::PIC12:
00110
00111 asmSwitch = "-mpic12";
00112 break;
00113 case AsmInfo::PIC14:
00114 asmSwitch = "-mpic14";
00115 break;
00116 case AsmInfo::PIC16:
00117 asmSwitch = "-mpic16";
00118 break;
00119 }
00120
00121 *m_languageProcess << (asmSwitch);
00122
00123 *m_languageProcess << ( "-"+options.m_picID.lower() );
00124
00125 *m_languageProcess << ( options.inputFiles().first() );
00126
00127 *m_languageProcess << ("-o");
00128 *m_languageProcess << ( options.intermediaryOutput() );
00129
00130 if ( !start() )
00131 {
00132 KMessageBox::sorry( LanguageManager::self()->logView(), i18n("Compilation failed. Please check you have sdcc installed.") );
00133 processInitFailed();
00134 return;
00135 }
00136 }
00137
00138
00139 bool SDCC::isError( const QString &message ) const
00140 {
00141 return false;
00142 }
00143
00144
00145 bool SDCC::isStderrOutputFatal( const QString & message ) const
00146 {
00147 if ( message.startsWith("Processor:") )
00148 return false;
00149
00150 return true;
00151 }
00152
00153
00154 bool SDCC::isWarning( const QString &message ) const
00155 {
00156 return false;
00157 }
00158
00159
00160 ProcessOptions::ProcessPath::Path SDCC::outputPath( ProcessOptions::ProcessPath::Path inputPath ) const
00161 {
00162 switch (inputPath)
00163 {
00164 case ProcessOptions::ProcessPath::C_AssemblyRelocatable:
00165 return ProcessOptions::ProcessPath::None;
00166
00167 case ProcessOptions::ProcessPath::C_Library:
00168 return ProcessOptions::ProcessPath::AssemblyRelocatable_Library;
00169
00170 case ProcessOptions::ProcessPath::C_Object:
00171 return ProcessOptions::ProcessPath::AssemblyRelocatable_Object;
00172
00173 case ProcessOptions::ProcessPath::C_PIC:
00174 return ProcessOptions::ProcessPath::AssemblyAbsolute_PIC;
00175
00176 case ProcessOptions::ProcessPath::C_Program:
00177 return ProcessOptions::ProcessPath::AssemblyRelocatable_Program;
00178
00179 case ProcessOptions::ProcessPath::AssemblyAbsolute_PIC:
00180 case ProcessOptions::ProcessPath::AssemblyAbsolute_Program:
00181 case ProcessOptions::ProcessPath::AssemblyRelocatable_Library:
00182 case ProcessOptions::ProcessPath::AssemblyRelocatable_Object:
00183 case ProcessOptions::ProcessPath::AssemblyRelocatable_PIC:
00184 case ProcessOptions::ProcessPath::AssemblyRelocatable_Program:
00185 case ProcessOptions::ProcessPath::FlowCode_AssemblyAbsolute:
00186 case ProcessOptions::ProcessPath::FlowCode_Microbe:
00187 case ProcessOptions::ProcessPath::FlowCode_PIC:
00188 case ProcessOptions::ProcessPath::FlowCode_Program:
00189 case ProcessOptions::ProcessPath::Microbe_AssemblyAbsolute:
00190 case ProcessOptions::ProcessPath::Microbe_PIC:
00191 case ProcessOptions::ProcessPath::Microbe_Program:
00192 case ProcessOptions::ProcessPath::Object_Disassembly:
00193 case ProcessOptions::ProcessPath::Object_Library:
00194 case ProcessOptions::ProcessPath::Object_PIC:
00195 case ProcessOptions::ProcessPath::Object_Program:
00196 case ProcessOptions::ProcessPath::PIC_AssemblyAbsolute:
00197 case ProcessOptions::ProcessPath::Program_Disassembly:
00198 case ProcessOptions::ProcessPath::Program_PIC:
00199 case ProcessOptions::ProcessPath::Invalid:
00200 case ProcessOptions::ProcessPath::None:
00201 return ProcessOptions::ProcessPath::Invalid;
00202 }
00203
00204 return ProcessOptions::ProcessPath::Invalid;
00205 }