sdcc.cpp

00001 /***************************************************************************
00002  *   Copyright (C) 2005 by David Saxton                                    *
00003  *   david@bluehaze.org                                                    *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
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         //BEGIN Pass custom sdcc options
00053 #define ARG(text,option) if ( KTLConfig::text() ) *m_languageProcess << ( QString("--%1").arg(option) );
00054         // General
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         // Code generation
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         // Optimization
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         // PIC16 Specific
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         //END Pass custom sdcc options
00101         
00102         
00103         *m_languageProcess << ("--debug"); // Enable debugging symbol output
00104         *m_languageProcess << ("-S"); // Compile only; do not assemble or link
00105         
00106         QString asmSwitch;
00107         switch ( info->instructionSet()->set() )
00108         {
00109                 case AsmInfo::PIC12:
00110                         // Last time I checked, SDCC doesn't support Pic12, and probably never will, but whatever...
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 }

Generated on Tue May 8 17:05:32 2007 for KTechLab by  doxygen 1.5.1