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