slang_rs.cpp revision b257301a1c711ba81458a4f8bf3c99c91c91a047
1#include "slang_rs.h" 2 3#include "clang/Sema/SemaDiagnostic.h" 4 5#include "slang_rs_backend.h" 6#include "slang_rs_context.h" 7 8using namespace slang; 9 10#define RS_HEADER_SUFFIX "rsh" 11 12#define ENUM_RS_HEADER() \ 13 RS_HEADER_ENTRY(rs_types) \ 14 RS_HEADER_ENTRY(rs_cl) \ 15 RS_HEADER_ENTRY(rs_core) \ 16 RS_HEADER_ENTRY(rs_math) 17 18#define RS_HEADER_ENTRY(x) \ 19 extern const char x ## _header[]; \ 20 extern unsigned x ## _header_size; 21ENUM_RS_HEADER() 22#undef RS_HEADER_ENTRY 23 24void SlangRS::initDiagnostic() { 25 clang::Diagnostic &Diag = getDiagnostics(); 26 if (!Diag.setDiagnosticGroupMapping( 27 "implicit-function-declaration", clang::diag::MAP_ERROR)) 28 assert(false && "Unable to find option group " 29 "implicit-function-declaration"); 30 Diag.setDiagnosticMapping( 31 clang::diag::ext_typecheck_convert_discards_qualifiers, 32 clang::diag::MAP_ERROR); 33 return; 34} 35 36void SlangRS::initPreprocessor() { 37 clang::Preprocessor &PP = getPreprocessor(); 38 39 std::string RSH; 40#define RS_HEADER_ENTRY(x) \ 41 RSH.append("#line 1 \"" #x "."RS_HEADER_SUFFIX"\"\n"); \ 42 RSH.append(x ## _header, x ## _header_size); 43ENUM_RS_HEADER() 44#undef RS_HEADER_ENTRY 45 PP.setPredefines(RSH); 46 47 return; 48} 49 50void SlangRS::initASTContext() { 51 mRSContext = new RSContext(&getPreprocessor(), 52 &getASTContext(), 53 &getTargetInfo()); 54 return; 55} 56 57clang::ASTConsumer 58*SlangRS::createBackend(const clang::CodeGenOptions& CodeGenOpts, 59 llvm::raw_ostream *OS, 60 Slang::OutputType OT) { 61 return new RSBackend(mRSContext, 62 getDiagnostics(), 63 CodeGenOpts, 64 getTargetOptions(), 65 mPragmas, 66 OS, 67 OT, 68 getSourceManager(), 69 mAllowRSPrefix); 70} 71 72SlangRS::SlangRS(const char *Triple, const char *CPU, const char **Features) 73 : Slang(Triple, CPU, Features), mRSContext(NULL), mAllowRSPrefix(false) { 74 return; 75} 76 77bool SlangRS::reflectToJava(const char *OutputPackageName, 78 char *RealPackageNameBuf, 79 int BufSize) { 80 if (mRSContext) 81 return mRSContext->reflectToJava(OutputPackageName, 82 getInputFileName(), 83 getOutputFileName(), 84 RealPackageNameBuf, 85 BufSize); 86 else 87 return false; 88} 89 90bool SlangRS::reflectToJavaPath(const char *OutputPathName) { 91 if (mRSContext) 92 return mRSContext->reflectToJavaPath(OutputPathName); 93 else 94 return false; 95} 96 97SlangRS::~SlangRS() { 98 delete mRSContext; 99 return; 100} 101