slang_rs.cpp revision 3c250c5d6cbf4123e959a3466990fda9fa50987a
13a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs.h" 23a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 33a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Sema/SemaDiagnostic.h" 43a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 53a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs_backend.h" 63a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs_context.h" 73a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 83a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changusing namespace slang; 93a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 103c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_SUFFIX "rsh" 113c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang 123c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define ENUM_RS_HEADER() \ 133c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang RS_HEADER_ENTRY(rs_types) \ 143c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang RS_HEADER_ENTRY(rs_cl) \ 153c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang RS_HEADER_ENTRY(rs_core) \ 163c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang RS_HEADER_ENTRY(rs_graphics) \ 173c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang RS_HEADER_ENTRY(rs_math) 183c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang 193c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_ENTRY(x) \ 203c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang extern const char x ## _header[]; \ 213c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang extern unsigned x ## _header_size; 223c250c5d6cbf4123e959a3466990fda9fa50987aZonr ChangENUM_RS_HEADER() 233c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#undef RS_HEADER_ENTRY 243c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang 253a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initDiagnostic() { 263a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang clang::Diagnostic &Diag = getDiagnostics(); 273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang if (!Diag.setDiagnosticGroupMapping( 283a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang "implicit-function-declaration", clang::diag::MAP_ERROR)) 293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang assert(false && "Unable to find option group " 303a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang "implicit-function-declaration"); 313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Diag.setDiagnosticMapping( 323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang clang::diag::ext_typecheck_convert_discards_qualifiers, 333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang clang::diag::MAP_ERROR); 343a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initPreprocessor() { 383a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang clang::Preprocessor &PP = getPreprocessor(); 393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 403c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang std::string RSH; 413c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_ENTRY(x) \ 423c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang RSH.append("#line 1 \"" #x "."RS_HEADER_SUFFIX"\"\n"); \ 433c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang RSH.append(x ## _header, x ## _header_size); 443c250c5d6cbf4123e959a3466990fda9fa50987aZonr ChangENUM_RS_HEADER() 453c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#undef RS_HEADER_ENTRY 463c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang PP.setPredefines(RSH); 473c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang 483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initASTContext() { 523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mRSContext = new RSContext(&getPreprocessor(), 533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang &getASTContext(), 543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang &getTargetInfo()); 553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 563a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 583a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclang::ASTConsumer 593a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang*SlangRS::createBackend(const clang::CodeGenOptions& CodeGenOpts, 603a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::raw_ostream *OS, 613a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType OT) { 623a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return new RSBackend(mRSContext, 633a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang getDiagnostics(), 643a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang CodeGenOpts, 653a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang getTargetOptions(), 663a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mPragmas, 673a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OS, 683a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OT, 693a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang getSourceManager(), 703a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang mAllowRSPrefix); 713a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 723a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 733a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr ChangSlangRS::SlangRS(const char *Triple, const char *CPU, const char **Features) 743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang : Slang(Triple, CPU, Features), mRSContext(NULL), mAllowRSPrefix(false) { 753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 763a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 773a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 783a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool SlangRS::reflectToJava(const char *OutputPackageName, 793a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang char *RealPackageNameBuf, 803a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang int BufSize) { 813a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang if (mRSContext) 823a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return mRSContext->reflectToJava(OutputPackageName, 833a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang getInputFileName(), 843a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang getOutputFileName(), 853a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang RealPackageNameBuf, 863a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang BufSize); 873a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang else 883a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return false; 893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 913a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool SlangRS::reflectToJavaPath(const char *OutputPathName) { 923a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang if (mRSContext) 933a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return mRSContext->reflectToJavaPath(OutputPathName); 943a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang else 953a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return false; 963a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 973a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 983a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr ChangSlangRS::~SlangRS() { 993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang delete mRSContext; 1003a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return; 1013a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 102