2012-09-05 13:37:39 +04:00
//------------------------------------------------------------------------------
// CLING - the C++ LLVM-based InterpreterG :)
// author: Lukasz Janyst <ljanyst@cern.ch>
2014-01-07 14:08:37 +04:00
//
// This file is dual-licensed: you can choose to license it under the University
// of Illinois Open Source License or the GNU Lesser General Public License. See
// LICENSE.TXT for details.
2012-09-05 13:37:39 +04:00
//------------------------------------------------------------------------------
# include "cling/Interpreter/Interpreter.h"
# include "cling/MetaProcessor/MetaProcessor.h"
# include "cling/UserInterface/UserInterface.h"
# include "clang/Basic/LangOptions.h"
# include "clang/Frontend/CompilerInstance.h"
# include "llvm/Support/Signals.h"
# include "llvm/Support/PrettyStackTrace.h"
# include "llvm/Support/ManagedStatic.h"
# include <iostream>
# include <vector>
# include <string>
int main ( int argc , char * * argv ) {
llvm : : llvm_shutdown_obj shutdownTrigger ;
//llvm::sys::PrintStackTraceOnErrorSignal();
//llvm::PrettyStackTraceProgram X(argc, argv);
// Set up the interpreter
cling : : Interpreter interp ( argc , argv ) ;
if ( interp . getOptions ( ) . Help ) {
return 0 ;
}
clang : : CompilerInstance * CI = interp . getCI ( ) ;
interp . AddIncludePath ( " . " ) ;
for ( size_t I = 0 , N = interp . getOptions ( ) . LibsToLoad . size ( ) ; I < N ; + + I ) {
interp . loadFile ( interp . getOptions ( ) . LibsToLoad [ I ] ) ;
}
2013-08-06 14:31:58 +04:00
// Interactive means no input (or one input that's "-")
2014-04-24 19:17:33 +04:00
std : : vector < std : : string > & Inputs = interp . getOptions ( ) . Inputs ;
2013-08-06 14:31:58 +04:00
bool Interactive = Inputs . empty ( ) | | ( Inputs . size ( ) = = 1
2014-04-24 19:17:33 +04:00
& & Inputs [ 0 ] = = " - " ) ;
2013-08-06 14:31:58 +04:00
cling : : UserInterface ui ( interp ) ;
// If we are not interactive we're supposed to parse files
if ( ! Interactive ) {
for ( size_t I = 0 , N = Inputs . size ( ) ; I < N ; + + I ) {
2014-08-03 16:20:19 +04:00
std : : string line ;
if ( llvm : : sys : : fs : : exists ( Inputs [ I ] ) )
line + = " .x " ;
2014-04-24 19:17:33 +04:00
line + = Inputs [ I ] ;
2013-08-06 14:31:58 +04:00
cling : : Interpreter : : CompilationResult compRes ;
ui . getMetaProcessor ( ) - > process ( line . c_str ( ) , compRes , 0 ) ;
}
}
else {
ui . runInteractively ( interp . getOptions ( ) . NoLogo ) ;
}
2014-08-04 06:05:42 +04:00
bool ret = CI - > getDiagnostics ( ) . getClient ( ) - > getNumErrors ( ) ;
2013-08-06 14:31:58 +04:00
// if we are running with -verify a reported has to be returned as unsuccess.
// This is relevant especially for the test suite.
if ( CI - > getDiagnosticOpts ( ) . VerifyDiagnostics ) {
// If there was an error that came from the verifier we must return 1 as
// an exit code for the process. This will make the test fail as expected.
clang : : DiagnosticConsumer * client = CI - > getDiagnostics ( ) . getClient ( ) ;
client - > EndSourceFile ( ) ;
ret = client - > getNumErrors ( ) ;
// The interpreter expects BeginSourceFile/EndSourceFiles to be balanced.
client - > BeginSourceFile ( CI - > getLangOpts ( ) , & CI - > getPreprocessor ( ) ) ;
}
return ret ;
2012-09-05 13:37:39 +04:00
}