Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 1 | #include "slang_rs.h" |
| 2 | |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 3 | #include <cstring> |
| 4 | |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 5 | #include "clang/Sema/SemaDiagnostic.h" |
| 6 | |
| 7 | #include "slang_rs_backend.h" |
| 8 | #include "slang_rs_context.h" |
| 9 | |
| 10 | using namespace slang; |
| 11 | |
Zonr Chang | 3c250c5 | 2010-10-07 12:19:23 +0800 | [diff] [blame] | 12 | #define RS_HEADER_SUFFIX "rsh" |
| 13 | |
| 14 | #define ENUM_RS_HEADER() \ |
| 15 | RS_HEADER_ENTRY(rs_types) \ |
| 16 | RS_HEADER_ENTRY(rs_cl) \ |
| 17 | RS_HEADER_ENTRY(rs_core) \ |
Zonr Chang | 3c250c5 | 2010-10-07 12:19:23 +0800 | [diff] [blame] | 18 | RS_HEADER_ENTRY(rs_math) |
| 19 | |
| 20 | #define RS_HEADER_ENTRY(x) \ |
| 21 | extern const char x ## _header[]; \ |
| 22 | extern unsigned x ## _header_size; |
| 23 | ENUM_RS_HEADER() |
| 24 | #undef RS_HEADER_ENTRY |
| 25 | |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 26 | void SlangRS::initDiagnostic() { |
| 27 | clang::Diagnostic &Diag = getDiagnostics(); |
| 28 | if (!Diag.setDiagnosticGroupMapping( |
| 29 | "implicit-function-declaration", clang::diag::MAP_ERROR)) |
| 30 | assert(false && "Unable to find option group " |
| 31 | "implicit-function-declaration"); |
| 32 | Diag.setDiagnosticMapping( |
| 33 | clang::diag::ext_typecheck_convert_discards_qualifiers, |
| 34 | clang::diag::MAP_ERROR); |
| 35 | return; |
| 36 | } |
| 37 | |
| 38 | void SlangRS::initPreprocessor() { |
| 39 | clang::Preprocessor &PP = getPreprocessor(); |
| 40 | |
Zonr Chang | 3c250c5 | 2010-10-07 12:19:23 +0800 | [diff] [blame] | 41 | std::string RSH; |
| 42 | #define RS_HEADER_ENTRY(x) \ |
| 43 | RSH.append("#line 1 \"" #x "."RS_HEADER_SUFFIX"\"\n"); \ |
| 44 | RSH.append(x ## _header, x ## _header_size); |
| 45 | ENUM_RS_HEADER() |
| 46 | #undef RS_HEADER_ENTRY |
| 47 | PP.setPredefines(RSH); |
| 48 | |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 49 | return; |
| 50 | } |
| 51 | |
| 52 | void SlangRS::initASTContext() { |
| 53 | mRSContext = new RSContext(&getPreprocessor(), |
| 54 | &getASTContext(), |
| 55 | &getTargetInfo()); |
| 56 | return; |
| 57 | } |
| 58 | |
| 59 | clang::ASTConsumer |
| 60 | *SlangRS::createBackend(const clang::CodeGenOptions& CodeGenOpts, |
| 61 | llvm::raw_ostream *OS, |
| 62 | Slang::OutputType OT) { |
| 63 | return new RSBackend(mRSContext, |
| 64 | getDiagnostics(), |
| 65 | CodeGenOpts, |
| 66 | getTargetOptions(), |
| 67 | mPragmas, |
| 68 | OS, |
| 69 | OT, |
| 70 | getSourceManager(), |
| 71 | mAllowRSPrefix); |
| 72 | } |
| 73 | |
Zonr Chang | 592a954 | 2010-10-07 20:03:58 +0800 | [diff] [blame] | 74 | bool SlangRS::IsRSHeaderFile(const char *File) { |
| 75 | #define RS_HEADER_ENTRY(x) \ |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 76 | if (::strcmp(File, #x "."RS_HEADER_SUFFIX) == 0) \ |
Zonr Chang | 592a954 | 2010-10-07 20:03:58 +0800 | [diff] [blame] | 77 | return true; |
| 78 | ENUM_RS_HEADER() |
| 79 | #undef RS_HEADER_ENTRY |
| 80 | // Deal with rs_graphics.rsh special case |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 81 | if (::strcmp(File, "rs_graphics."RS_HEADER_SUFFIX) == 0) |
Zonr Chang | 592a954 | 2010-10-07 20:03:58 +0800 | [diff] [blame] | 82 | return true; |
| 83 | return false; |
| 84 | } |
| 85 | |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 86 | SlangRS::SlangRS(const std::string &Triple, const std::string &CPU, |
| 87 | const std::vector<std::string> &Features) |
| 88 | : Slang(Triple, CPU, Features), |
| 89 | mRSContext(NULL), |
| 90 | mAllowRSPrefix(false) { |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 91 | return; |
| 92 | } |
| 93 | |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 94 | bool SlangRS::reflectToJava(const std::string &OutputPathBase, |
| 95 | const std::string &OutputPackageName, |
| 96 | std::string *RealPackageName) { |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 97 | if (mRSContext) |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 98 | return mRSContext->reflectToJava(OutputPathBase, |
| 99 | OutputPackageName, |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 100 | getInputFileName(), |
| 101 | getOutputFileName(), |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 102 | RealPackageName); |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 103 | else |
| 104 | return false; |
| 105 | } |
| 106 | |
Shih-wei Liao | b81c6a4 | 2010-10-10 14:15:00 -0700 | [diff] [blame] | 107 | void SlangRS::reset() { |
| 108 | Slang::reset(); |
| 109 | delete mRSContext; |
| 110 | mRSContext = NULL; |
| 111 | return; |
Zonr Chang | 3a9ca1f | 2010-10-06 17:52:56 +0800 | [diff] [blame] | 112 | } |
| 113 | |
| 114 | SlangRS::~SlangRS() { |
| 115 | delete mRSContext; |
| 116 | return; |
| 117 | } |