slang_rs.cpp revision 592a954aae4cb946970b557e94afd5ee453fd57e
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_math)
173c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
183c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_ENTRY(x)  \
193c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  extern const char x ## _header[]; \
203c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  extern unsigned x ## _header_size;
213c250c5d6cbf4123e959a3466990fda9fa50987aZonr ChangENUM_RS_HEADER()
223c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#undef RS_HEADER_ENTRY
233c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
243a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initDiagnostic() {
253a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  clang::Diagnostic &Diag = getDiagnostics();
263a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  if (!Diag.setDiagnosticGroupMapping(
273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang        "implicit-function-declaration", clang::diag::MAP_ERROR))
283a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    assert(false && "Unable to find option group "
293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang        "implicit-function-declaration");
303a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  Diag.setDiagnosticMapping(
313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang      clang::diag::ext_typecheck_convert_discards_qualifiers,
323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang      clang::diag::MAP_ERROR);
333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
343a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
353a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initPreprocessor() {
373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  clang::Preprocessor &PP = getPreprocessor();
383a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
393c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  std::string RSH;
403c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_ENTRY(x)  \
413c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RSH.append("#line 1 \"" #x "."RS_HEADER_SUFFIX"\"\n"); \
423c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RSH.append(x ## _header, x ## _header_size);
433c250c5d6cbf4123e959a3466990fda9fa50987aZonr ChangENUM_RS_HEADER()
443c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#undef RS_HEADER_ENTRY
453c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  PP.setPredefines(RSH);
463c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initASTContext() {
513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mRSContext = new RSContext(&getPreprocessor(),
523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                             &getASTContext(),
533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                             &getTargetInfo());
543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
563a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
573a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclang::ASTConsumer
583a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang*SlangRS::createBackend(const clang::CodeGenOptions& CodeGenOpts,
593a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                        llvm::raw_ostream *OS,
603a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                        Slang::OutputType OT) {
613a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    return new RSBackend(mRSContext,
623a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         getDiagnostics(),
633a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         CodeGenOpts,
643a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         getTargetOptions(),
653a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         mPragmas,
663a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         OS,
673a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         OT,
683a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         getSourceManager(),
693a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         mAllowRSPrefix);
703a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
713a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
72592a954aae4cb946970b557e94afd5ee453fd57eZonr Changbool SlangRS::IsRSHeaderFile(const char *File) {
73592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang#define RS_HEADER_ENTRY(x)  \
74592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang  if (strcmp(File, #x "."RS_HEADER_SUFFIX) == 0) \
75592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang    return true;
76592a954aae4cb946970b557e94afd5ee453fd57eZonr ChangENUM_RS_HEADER()
77592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang#undef RS_HEADER_ENTRY
78592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang  // Deal with rs_graphics.rsh special case
79592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang  if (strcmp(File, "rs_graphics."RS_HEADER_SUFFIX) == 0)
80592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang    return true;
81592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang  return false;
82592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang}
83592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang
843a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr ChangSlangRS::SlangRS(const char *Triple, const char *CPU, const char **Features)
853a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    : Slang(Triple, CPU, Features),  mRSContext(NULL), mAllowRSPrefix(false) {
863a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
873a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
883a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool SlangRS::reflectToJava(const char *OutputPackageName,
903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                            char *RealPackageNameBuf,
913a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                            int BufSize) {
923a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  if (mRSContext)
933a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    return mRSContext->reflectToJava(OutputPackageName,
943a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                     getInputFileName(),
953a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                     getOutputFileName(),
963a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                     RealPackageNameBuf,
973a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                     BufSize);
983a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  else
993a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    return false;
1003a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1013a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
1023a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool SlangRS::reflectToJavaPath(const char *OutputPathName) {
1033a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  if (mRSContext)
1043a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    return mRSContext->reflectToJavaPath(OutputPathName);
1053a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  else
1063a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    return false;
1073a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1083a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
1093a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr ChangSlangRS::~SlangRS() {
1103a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  delete mRSContext;
1113a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
1123a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
113