blob: 175f7dd266a39562818b56aa074b1be59dfea9b9 [file] [log] [blame]
/*
Copyright 2019 Alain Dargelas
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
* File: Compiler.h
* Author: alain
*
* Created on March 4, 2017, 5:16 PM
*/
#ifndef COMPILER_H
#define COMPILER_H
#include <string>
#include <set>
#include <map>
#include <thread>
#include "Design/Design.h"
#include "Library/LibrarySet.h"
#include "Config/ConfigSet.h"
#include "SourceCompile/PreprocessFile.h"
#ifdef USETBB
#include <tbb/task.h>
#include <tbb/task_group.h>
#include "tbb/task_scheduler_init.h"
#endif
namespace SURELOG {
class PreprocessFile;
class Compiler {
public:
Compiler(CommandLineParser* commandLineParser, ErrorContainer* errors,
SymbolTable* symbolTable);
bool compile();
Compiler(const Compiler& orig);
virtual ~Compiler();
CommandLineParser* getCommandLineParser() { return m_commandLineParser; }
SymbolTable* getSymbolTable() { return m_symbolTable; }
ErrorContainer* getErrorContainer() { return m_errors; }
const std::map<SymbolId, PreprocessFile::AntlrParserHandler*>&
getPpAntlrHandlerMap() {
return m_antlrPpMap;
}
void registerAntlrPpHandlerForId(SymbolId id,
PreprocessFile::AntlrParserHandler* pp);
PreprocessFile::AntlrParserHandler* getAntlrPpHandlerForId(SymbolId);
ErrorContainer::Stats getErrorStats();
LibrarySet* getLibrarySet() { return m_librarySet; }
Design* getDesign() { return m_design; }
bool isLibraryFile(SymbolId id);
#ifdef USETBB
tbb::task_group& getTaskGroup() { return m_taskGroup; }
#endif
private:
bool parseLibrariesDef_();
bool ppinit_();
bool createFileList_();
bool createMultiProcess_();
bool parseinit_();
bool pythoninit_();
bool compileFileSet_(CompileSourceFile::Action action, bool allowMultithread,
std::vector<CompileSourceFile*>& container);
bool compileOneFile_(CompileSourceFile* compileSource,
CompileSourceFile::Action action);
bool cleanup_();
CommandLineParser* m_commandLineParser;
ErrorContainer* m_errors;
SymbolTable* m_symbolTable;
CompilationUnit* m_commonCompilationUnit;
std::map<SymbolId, PreprocessFile::AntlrParserHandler*> m_antlrPpMap;
std::vector<CompileSourceFile*> m_compilers;
std::vector<CompileSourceFile*> m_compilersChunkFiles;
std::vector<CompileSourceFile*> m_compilersParentFiles;
std::vector<CompilationUnit*> m_compilationUnits;
std::vector<SymbolTable*> m_symbolTables;
std::vector<ErrorContainer*> m_errorContainers;
LibrarySet* m_librarySet;
ConfigSet* m_configSet;
Design* m_design;
std::set<SymbolId> m_libraryFiles; // -v <file>
#ifdef USETBB
tbb::task_group m_taskGroup;
#endif
};
}; // namespace SURELOG
#endif /* COMPILER_H */