447 lines
17 KiB
C++
447 lines
17 KiB
C++
#include "compilerinfo.h"
|
|
#include <QObject>
|
|
|
|
CompilerInfo::CompilerInfo(const QString &name):
|
|
mName(name)
|
|
{
|
|
}
|
|
|
|
const QList<PCompilerOption> &CompilerInfo::compilerOptions() const
|
|
{
|
|
return mCompilerOptionList;
|
|
}
|
|
|
|
const QString &CompilerInfo::name() const
|
|
{
|
|
return mName;
|
|
}
|
|
|
|
PCompilerOption CompilerInfo::getCompilerOption(const QString &key) const
|
|
{
|
|
return mCompilerOptions.value(key,PCompilerOption());
|
|
}
|
|
|
|
bool CompilerInfo::hasCompilerOption(const QString &key) const
|
|
{
|
|
return mCompilerOptions.contains(key);
|
|
}
|
|
|
|
bool CompilerInfo::supportSyntaxCheck()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void CompilerInfo::addOption(const QString &key, const QString &name, const QString section, bool isC, bool isCpp, bool isLinker, const QString &setting, const CompileOptionChoiceList &choices)
|
|
{
|
|
PCompilerOption pOption = std::make_shared<CompilerOption>();
|
|
pOption->key = key;
|
|
pOption->name = name;
|
|
pOption->section = section;
|
|
pOption->isC = isC;
|
|
pOption->isCpp = isCpp;
|
|
pOption->isLinker = isLinker;
|
|
pOption->setting= setting;
|
|
pOption->choices = choices;
|
|
mCompilerOptions.insert(key,pOption);
|
|
mCompilerOptionList.append(pOption);
|
|
}
|
|
|
|
void CompilerInfo::init()
|
|
{
|
|
prepareCompilerOptions();
|
|
}
|
|
|
|
void CompilerInfo::prepareCompilerOptions()
|
|
{
|
|
QList<QPair<QString,QString>> sl;
|
|
QString groupName;
|
|
// // C options
|
|
// groupName = QObject::tr("C options");
|
|
// addOption(CC_CMD_OPT_ANSI, QObject::tr("Support all ANSI standard C programs (-ansi)"), groupName, true, true, false, "-ansi");
|
|
// addOption(CC_CMD_OPT_NO_ASM, QObject::tr("Do not recognize asm,inline or typeof as a keyword (-fno-asm)"), groupName, true, true, false, "-fno-asm");
|
|
// addOption(CC_CMD_OPT_TRADITIONAL_CPP, QObject::tr("Imitate traditional C preprocessors (-traditional-cpp)"), groupName, true, true, false, "-traditional-cpp");
|
|
|
|
groupName = QObject::tr("Code Generation");
|
|
// Optimization
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("Low (-O1)","1"));
|
|
sl.append(QPair<QString,QString>("Med (-O2)","2"));
|
|
sl.append(QPair<QString,QString>("High (-O3)","3"));
|
|
sl.append(QPair<QString,QString>("Highest (-Ofast)","fast"));
|
|
sl.append(QPair<QString,QString>("Size (-Os)","s"));
|
|
sl.append(QPair<QString,QString>("Debug (-Og)","g"));
|
|
addOption(CC_CMD_OPT_OPTIMIZE, QObject::tr("Optimization level (-Ox)"), groupName, true, true, false, "-O", sl);
|
|
|
|
// C++ Language Standards
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("ISO C++","c++98"));
|
|
sl.append(QPair<QString,QString>("ISO C++11","c++11"));
|
|
sl.append(QPair<QString,QString>("ISO C++14","c++14"));
|
|
sl.append(QPair<QString,QString>("ISO C++17","c++17"));
|
|
sl.append(QPair<QString,QString>("ISO C++20","c++2a"));
|
|
sl.append(QPair<QString,QString>("ISO C++23","c++2b"));
|
|
sl.append(QPair<QString,QString>("GNU C++","gnu++98"));
|
|
sl.append(QPair<QString,QString>("GNU C++11","gnu++11"));
|
|
sl.append(QPair<QString,QString>("GNU C++14","gnu++14"));
|
|
sl.append(QPair<QString,QString>("GNU C++17","gnu++17"));
|
|
sl.append(QPair<QString,QString>("GNU C++20","gnu++2a"));
|
|
sl.append(QPair<QString,QString>("GNU C++23","gnu++2b"));
|
|
addOption(CC_CMD_OPT_STD, QObject::tr("C++ Language standard (-std)"), groupName, false, true, false, "-std=", sl);
|
|
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("ISO C90","c90"));
|
|
sl.append(QPair<QString,QString>("ISO C99","c99"));
|
|
sl.append(QPair<QString,QString>("ISO C11","c11"));
|
|
sl.append(QPair<QString,QString>("ISO C17","c17"));
|
|
sl.append(QPair<QString,QString>("GNU C90","gnu90"));
|
|
sl.append(QPair<QString,QString>("GNU C99","gnu99"));
|
|
sl.append(QPair<QString,QString>("GNU C11","gnu11"));
|
|
sl.append(QPair<QString,QString>("GNU C17","gnu17"));
|
|
addOption(C_CMD_OPT_STD, QObject::tr("C Language standard (-std)"), groupName, true, false, false, "-std=", sl);
|
|
|
|
// Optimization for cpu type
|
|
// sl.clear();
|
|
// sl.append(QPair<QString,QString>(QObject::tr("This CPU"),"native"));
|
|
// sl.append(QPair<QString,QString>("i386","i386"));
|
|
// sl.append(QPair<QString,QString>("i486","i486"));
|
|
// sl.append(QPair<QString,QString>("i586","i586"));
|
|
// sl.append(QPair<QString,QString>("i686","i686"));
|
|
// sl.append(QPair<QString,QString>("Pentium","pentium"));
|
|
// sl.append(QPair<QString,QString>("Pentium MMX","pentium-mmx"));
|
|
// sl.append(QPair<QString,QString>("Pentium Pro","pentiumpro"));
|
|
// sl.append(QPair<QString,QString>("Pentium 2","pentium2"));
|
|
// sl.append(QPair<QString,QString>("Pentium 3","pentium3"));
|
|
// sl.append(QPair<QString,QString>("Pentium 4","pentium4"));
|
|
// sl.append(QPair<QString,QString>("Conroe","core2"));
|
|
// sl.append(QPair<QString,QString>("Nehalem","corei7"));
|
|
// sl.append(QPair<QString,QString>("Sandy","corei7-avx"));
|
|
// sl.append(QPair<QString,QString>("K6","k6"));
|
|
// sl.append(QPair<QString,QString>("K6-2","k6-2"));
|
|
// sl.append(QPair<QString,QString>("K6-3","k6-3"));
|
|
// sl.append(QPair<QString,QString>("Athlon","athlon"));
|
|
// sl.append(QPair<QString,QString>("Athlon Tbird","athlon-tbird"));
|
|
// sl.append(QPair<QString,QString>("Athlon 4","athlon-4"));
|
|
// sl.append(QPair<QString,QString>("Athlon XP","athlon-xp"));
|
|
// sl.append(QPair<QString,QString>("Athlon MP","athlon-mp"));
|
|
// sl.append(QPair<QString,QString>("K8","k8"));
|
|
// sl.append(QPair<QString,QString>("K8 Rev.E","k8-sse3"));
|
|
// sl.append(QPair<QString,QString>("K10","barcelona"));
|
|
// sl.append(QPair<QString,QString>("Bulldozer","bdver1"));
|
|
// addOption(CC_CMD_OPT_ARCH, QObject::tr("Optimize for the following machine (-march)"), groupName, true, true, false, "-march=", sl);
|
|
// addOption(CC_CMD_OPT_TUNE, QObject::tr("Optimize less, while maintaining full compatibility (-tune)"), groupName, true, true, false, "-mtune=", sl);
|
|
|
|
// Enable use of the specific instructions
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("MMX","mmx"));
|
|
sl.append(QPair<QString,QString>("3D Now","3dnow"));
|
|
sl.append(QPair<QString,QString>("SSE","sse"));
|
|
sl.append(QPair<QString,QString>("SSE2","sse2"));
|
|
sl.append(QPair<QString,QString>("SSE3","sse3"));
|
|
sl.append(QPair<QString,QString>("SSSE3","ssse3"));
|
|
sl.append(QPair<QString,QString>("SSE4","sse4"));
|
|
sl.append(QPair<QString,QString>("SSE4A","sse4a"));
|
|
sl.append(QPair<QString,QString>("SSE4.1","sse4.1"));
|
|
sl.append(QPair<QString,QString>("SSE4.2","sse4.2"));
|
|
sl.append(QPair<QString,QString>("AVX","avx"));
|
|
sl.append(QPair<QString,QString>("AVX2","avx2"));
|
|
sl.append(QPair<QString,QString>("FMA4","fma4"));
|
|
sl.append(QPair<QString,QString>("XOP","xop"));
|
|
sl.append(QPair<QString,QString>("AES","aes"));
|
|
addOption(CC_CMD_OPT_INSTRUCTION,QObject::tr("Enable use of specific instructions (-mx)"), groupName, true, true, false, "-m", sl);
|
|
|
|
// 32bit/64bit
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("32bit","32"));
|
|
sl.append(QPair<QString,QString>("64bit","64"));
|
|
addOption(CC_CMD_OPT_POINTER_SIZE, QObject::tr("Compile with the following pointer size (-mx)"), groupName, true, true, true, "-m", sl);
|
|
|
|
addOption(CC_CMD_OPT_DEBUG_INFO, QObject::tr("Generate debugging information (-g3)"), groupName, true, true, false, "-g3");
|
|
addOption(CC_CMD_OPT_PROFILE_INFO, QObject::tr("Generate profiling info for analysis (-pg)"), groupName, true, true, true, "-pg");
|
|
addOption(CC_CMD_OPT_SYNTAX_ONLY, QObject::tr("Only check the code for syntax errors (-fsyntax-only)"), groupName, true, true, false, "-fsyntax-only");
|
|
|
|
// Warnings
|
|
groupName = QObject::tr("Warnings");
|
|
addOption(CC_CMD_OPT_INHIBIT_ALL_WARNING, QObject::tr("Inhibit all warning messages (-w)"), groupName, true, true, false, "-w");
|
|
addOption(CC_CMD_OPT_WARNING_ALL,QObject::tr("Show most warnings (-Wall)"), groupName, true, true, false, "-Wall");
|
|
addOption(CC_CMD_OPT_WARNING_EXTRA,QObject::tr("Show some more warnings (-Wextra)"), groupName, true, true, false, "-Wextra");
|
|
addOption(CC_CMD_OPT_CHECK_ISO_CONFORMANCE, QObject::tr("Check ISO C/C++ conformance (-pedantic)"), groupName, true, true, false, "-pedantic");
|
|
addOption(CC_CMD_OPT_WARNING_AS_ERROR, QObject::tr("Make all warnings into errors (-Werror)"), groupName, true, true, false, "-Werror");
|
|
addOption(CC_CMD_OPT_ABORT_ON_ERROR , QObject::tr("Abort compilation on first error (-Wfatal-errors)"), groupName, true, true, false, "-Wfatal-errors");
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("Normal"," "));
|
|
sl.append(QPair<QString,QString>("Strong","-strong"));
|
|
sl.append(QPair<QString,QString>("All","-all"));
|
|
addOption(CC_CMD_OPT_STACK_PROTECTOR , QObject::tr("Check for stack smashing attacks (-fstack-protector)"), groupName, false, false, true, "-fstack-protector",sl);
|
|
#if defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("Address","address"));
|
|
sl.append(QPair<QString,QString>("Thread","thread"));
|
|
sl.append(QPair<QString,QString>("Leak","leak"));
|
|
sl.append(QPair<QString,QString>("Undefined","undefined"));
|
|
addOption(CC_CMD_OPT_ADDRESS_SANITIZER , QObject::tr("Enable Sanitizer (-fsanitize=)"), groupName, true, true, true, "-fsanitize=",sl);
|
|
#endif
|
|
|
|
// Output
|
|
//groupName = QObject::tr("Output");
|
|
//addOption(CC_CMD_OPT_VERBOSE_ASM, QObject::tr("Put comments in generated assembly code (-fverbose-asm)"), groupName, true, true, false, "-fverbose-asm");
|
|
//addOption(CC_CMD_OPT_ONLY_GEN_ASM_CODE, QObject::tr("Do not assemble, compile and generate the assemble code (-S)"), groupName, true, true, false, "-S");
|
|
//addOption(CC_CMD_OPT_STOP_AFTER_PREPROCESSING, QObject::tr("Do not compile, stop after the preprocessing stage (-E)"), groupName, true, true, false, "-E");
|
|
|
|
// Linker
|
|
groupName = QObject::tr("Linker");
|
|
addOption(CC_CMD_OPT_USE_PIPE, QObject::tr("Use pipes instead of temporary files during compilation (-pipe)"), groupName, true, true, false, "-pipe");
|
|
//addOption(LINK_CMD_OPT_LINK_OBJC, QObject::tr("Link an Objective C program (-lobjc)"), groupName, false, false, true, "-lobjc");
|
|
addOption(LINK_CMD_OPT_NO_LINK_STDLIB,QObject::tr("Do not use standard system libraries (-nostdlib)"), groupName, false, false, true, "-nostdlib");
|
|
addOption(LINK_CMD_OPT_NO_CONSOLE, QObject::tr("Do not create a console window (-mwindows)"), groupName,false, false, true, "-mwindows");
|
|
addOption(LINK_CMD_OPT_STRIP_EXE, QObject::tr("Strip executable (-s)"), groupName, false, false, true, "-s");
|
|
}
|
|
|
|
CompilerInfoManager::CompilerInfoManager()
|
|
{
|
|
PCompilerInfo compilerInfo = std::make_shared<ClangCompilerInfo>();
|
|
compilerInfo->init();
|
|
mInfos.insert(CompilerType::Clang, compilerInfo);
|
|
|
|
compilerInfo = std::make_shared<GCCCompilerInfo>();
|
|
compilerInfo->init();
|
|
mInfos.insert(CompilerType::GCC, compilerInfo);
|
|
|
|
compilerInfo = std::make_shared<GCCUTF8CompilerInfo>();
|
|
compilerInfo->init();
|
|
mInfos.insert(CompilerType::GCC_UTF8, compilerInfo);
|
|
|
|
#ifdef ENABLE_SDCC
|
|
compilerInfo = std::make_shared<SDCCCompilerInfo>();
|
|
compilerInfo->init();
|
|
mInfos.insert(CompilerType::SDCC, compilerInfo);
|
|
#endif
|
|
}
|
|
|
|
PCompilerInfo CompilerInfoManager::getInfo(CompilerType compilerType)
|
|
{
|
|
return getInstance()->mInfos.value(compilerType,PCompilerInfo());
|
|
}
|
|
|
|
bool CompilerInfoManager::hasCompilerOption(CompilerType compilerType, const QString &optKey)
|
|
{
|
|
PCompilerInfo pInfo = getInfo(compilerType);
|
|
if (!pInfo)
|
|
return false;
|
|
return pInfo->hasCompilerOption(optKey);
|
|
}
|
|
|
|
PCompilerOption CompilerInfoManager::getCompilerOption(CompilerType compilerType, const QString &optKey)
|
|
{
|
|
PCompilerInfo pInfo = getInfo(compilerType);
|
|
if (!pInfo)
|
|
return PCompilerOption();
|
|
return pInfo->getCompilerOption(optKey);
|
|
}
|
|
|
|
QList<PCompilerOption> CompilerInfoManager::getCompilerOptions(CompilerType compilerType)
|
|
{
|
|
PCompilerInfo pInfo = getInfo(compilerType);
|
|
if (!pInfo)
|
|
return QList<PCompilerOption>();
|
|
return pInfo->compilerOptions();
|
|
}
|
|
|
|
bool CompilerInfoManager::supportCovertingCharset(CompilerType compilerType)
|
|
{
|
|
PCompilerInfo pInfo = getInfo(compilerType);
|
|
if (!pInfo)
|
|
return false;
|
|
return pInfo->supportConvertingCharset();
|
|
}
|
|
|
|
bool CompilerInfoManager::supportStaticLink(CompilerType compilerType)
|
|
{
|
|
PCompilerInfo pInfo = getInfo(compilerType);
|
|
if (!pInfo)
|
|
return false;
|
|
return pInfo->supportStaticLink();
|
|
}
|
|
|
|
bool CompilerInfoManager::supportSyntaxCheck(CompilerType compilerType)
|
|
{
|
|
PCompilerInfo pInfo = getInfo(compilerType);
|
|
if (!pInfo)
|
|
return false;
|
|
return pInfo->supportSyntaxCheck();
|
|
}
|
|
|
|
bool CompilerInfoManager::forceUTF8InDebugger(CompilerType compilerType)
|
|
{
|
|
PCompilerInfo pInfo = getInfo(compilerType);
|
|
if (!pInfo)
|
|
return false;
|
|
return pInfo->forceUTF8InDebugger();
|
|
}
|
|
|
|
PCompilerInfoManager CompilerInfoManager::instance;
|
|
|
|
PCompilerInfoManager CompilerInfoManager::getInstance()
|
|
{
|
|
if (!instance) {
|
|
instance = std::make_shared<CompilerInfoManager>();
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
void CompilerInfoManager::addInfo(CompilerType compilerType, PCompilerInfo info)
|
|
{
|
|
getInstance()->mInfos.insert(compilerType,info);
|
|
}
|
|
|
|
ClangCompilerInfo::ClangCompilerInfo():CompilerInfo(COMPILER_CLANG)
|
|
{
|
|
}
|
|
|
|
bool ClangCompilerInfo::supportConvertingCharset()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool ClangCompilerInfo::forceUTF8InDebugger()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool ClangCompilerInfo::forceUTF8InMakefile()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool ClangCompilerInfo::supportStaticLink()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
GCCCompilerInfo::GCCCompilerInfo():CompilerInfo(COMPILER_GCC)
|
|
{
|
|
}
|
|
|
|
bool GCCCompilerInfo::supportConvertingCharset()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool GCCCompilerInfo::forceUTF8InDebugger()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool GCCCompilerInfo::forceUTF8InMakefile()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool GCCCompilerInfo::supportStaticLink()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
GCCUTF8CompilerInfo::GCCUTF8CompilerInfo():CompilerInfo(COMPILER_GCC_UTF8)
|
|
{
|
|
}
|
|
|
|
bool GCCUTF8CompilerInfo::supportConvertingCharset()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool GCCUTF8CompilerInfo::forceUTF8InDebugger()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool GCCUTF8CompilerInfo::forceUTF8InMakefile()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool GCCUTF8CompilerInfo::supportStaticLink()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
#ifdef ENABLE_SDCC
|
|
SDCCCompilerInfo::SDCCCompilerInfo():CompilerInfo(COMPILER_SDCC)
|
|
{
|
|
|
|
}
|
|
|
|
bool SDCCCompilerInfo::supportConvertingCharset()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool SDCCCompilerInfo::forceUTF8InDebugger()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool SDCCCompilerInfo::forceUTF8InMakefile()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool SDCCCompilerInfo::supportStaticLink()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
bool SDCCCompilerInfo::supportSyntaxCheck()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void SDCCCompilerInfo::prepareCompilerOptions()
|
|
{
|
|
QList<QPair<QString,QString>> sl;
|
|
QString groupName;
|
|
// // C options
|
|
// groupName = QObject::tr("C options");
|
|
// addOption(CC_CMD_OPT_ANSI, QObject::tr("Support all ANSI standard C programs (-ansi)"), groupName, true, true, false, "-ansi");
|
|
// addOption(CC_CMD_OPT_NO_ASM, QObject::tr("Do not recognize asm,inline or typeof as a keyword (-fno-asm)"), groupName, true, true, false, "-fno-asm");
|
|
// addOption(CC_CMD_OPT_TRADITIONAL_CPP, QObject::tr("Imitate traditional C preprocessors (-traditional-cpp)"), groupName, true, true, false, "-traditional-cpp");
|
|
|
|
groupName = QObject::tr("Code Generation");
|
|
// Optimization
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("Intel MCS51","mcs51"));
|
|
sl.append(QPair<QString,QString>("Dallas DS80C390","ds390"));
|
|
sl.append(QPair<QString,QString>("Dallas DS80C400","ds400"));
|
|
sl.append(QPair<QString,QString>("Freescale/Motorola HC08","hc08"));
|
|
sl.append(QPair<QString,QString>("Freescale/Motorola S08","s08"));
|
|
sl.append(QPair<QString,QString>("Zilog Z80","z80"));
|
|
sl.append(QPair<QString,QString>("Zilog Z180","z180"));
|
|
sl.append(QPair<QString,QString>("Rabbit 2000/3000","r2k"));
|
|
sl.append(QPair<QString,QString>("Rabbit 3000","r3ka"));
|
|
sl.append(QPair<QString,QString>("Sharp SM83","sm83"));
|
|
sl.append(QPair<QString,QString>("Toshiba TLCS-90","tlcs90"));
|
|
sl.append(QPair<QString,QString>("Zilog eZ80","ez80_z80"));
|
|
sl.append(QPair<QString,QString>("STM8","stm8"));
|
|
sl.append(QPair<QString,QString>("Padauk processors-13bit width memory","pdk13"));
|
|
sl.append(QPair<QString,QString>("Padauk processors-14bit width memory","pdk14"));
|
|
sl.append(QPair<QString,QString>("Padauk processors-15bit width memory","pdk15"));
|
|
addOption(SDCC_CMD_OPT_PROCESSOR, QObject::tr("Processor (-m)"), groupName, true, false, false, "-m", sl);
|
|
|
|
// C++ Language Standards
|
|
sl.clear();
|
|
sl.append(QPair<QString,QString>("ANSI C89/ISO C90","c89"));
|
|
sl.append(QPair<QString,QString>("ISO C99","c99"));
|
|
sl.append(QPair<QString,QString>("ISO C11","c11"));
|
|
sl.append(QPair<QString,QString>("ISO C17","c17"));
|
|
sl.append(QPair<QString,QString>("ISO C2x","c2x"));
|
|
sl.append(QPair<QString,QString>("SDCC C89","sdcc89"));
|
|
sl.append(QPair<QString,QString>("SDCC C99","sdcc99"));
|
|
sl.append(QPair<QString,QString>("SDCC C11","sdcc11"));
|
|
sl.append(QPair<QString,QString>("SDCC C17","sdcc17"));
|
|
sl.append(QPair<QString,QString>("SDCC C2x","sdcc2x"));
|
|
addOption(SDCC_CMD_OPT_STD, QObject::tr("Language standard (--std)"), groupName, true, false, false, "--std-", sl);
|
|
|
|
addOption(SDCC_OPT_NOSTARTUP, QObject::tr("Don't generate startup code"),groupName,false,false,false,"nostartup");
|
|
}
|
|
#endif
|