slang_rs.cpp revision a6d60672695f1438a63acdbf85eae7f97ce2b50d
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 72bool SlangRS::IsRSHeaderFile(const char *File) { 73#define RS_HEADER_ENTRY(x) \ 74 if (strcmp(File, #x "."RS_HEADER_SUFFIX) == 0) \ 75 return true; 76ENUM_RS_HEADER() 77#undef RS_HEADER_ENTRY 78 // Deal with rs_graphics.rsh special case 79 if (strcmp(File, "rs_graphics."RS_HEADER_SUFFIX) == 0) 80 return true; 81 return false; 82} 83 84SlangRS::SlangRS(const char *Triple, const char *CPU, const char **Features) 85 : Slang(Triple, CPU, Features), mRSContext(NULL), mAllowRSPrefix(false) { 86 return; 87} 88 89bool SlangRS::reflectToJava(const char *OutputPackageName, 90 char *RealPackageNameBuf, 91 int BufSize) { 92 if (mRSContext) 93 return mRSContext->reflectToJava(OutputPackageName, 94 getInputFileName(), 95 getOutputFileName(), 96 RealPackageNameBuf, 97 BufSize); 98 else 99 return false; 100} 101 102bool SlangRS::reflectToJavaPath(const char *OutputPathName) { 103 if (mRSContext) 104 return mRSContext->reflectToJavaPath(OutputPathName); 105 else 106 return false; 107} 108 109SlangRS::~SlangRS() { 110 delete mRSContext; 111 return; 112} 113