blob: 06e41578624721374ab1414ceacd82db384ddc33 [file] [log] [blame]
Zonr Chang3a9ca1f2010-10-06 17:52:56 +08001#include "slang_rs.h"
2
Shih-wei Liaob81c6a42010-10-10 14:15:00 -07003#include <cstring>
4
Zonr Chang3a9ca1f2010-10-06 17:52:56 +08005#include "clang/Sema/SemaDiagnostic.h"
6
7#include "slang_rs_backend.h"
8#include "slang_rs_context.h"
9
10using namespace slang;
11
Zonr Chang3c250c52010-10-07 12:19:23 +080012#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 Chang3c250c52010-10-07 12:19:23 +080018 RS_HEADER_ENTRY(rs_math)
19
20#define RS_HEADER_ENTRY(x) \
21 extern const char x ## _header[]; \
22 extern unsigned x ## _header_size;
23ENUM_RS_HEADER()
24#undef RS_HEADER_ENTRY
25
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080026void 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
38void SlangRS::initPreprocessor() {
39 clang::Preprocessor &PP = getPreprocessor();
40
Zonr Chang3c250c52010-10-07 12:19:23 +080041 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);
45ENUM_RS_HEADER()
46#undef RS_HEADER_ENTRY
47 PP.setPredefines(RSH);
48
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080049 return;
50}
51
52void SlangRS::initASTContext() {
53 mRSContext = new RSContext(&getPreprocessor(),
54 &getASTContext(),
55 &getTargetInfo());
56 return;
57}
58
59clang::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 Chang592a9542010-10-07 20:03:58 +080074bool SlangRS::IsRSHeaderFile(const char *File) {
75#define RS_HEADER_ENTRY(x) \
Shih-wei Liaob81c6a42010-10-10 14:15:00 -070076 if (::strcmp(File, #x "."RS_HEADER_SUFFIX) == 0) \
Zonr Chang592a9542010-10-07 20:03:58 +080077 return true;
78ENUM_RS_HEADER()
79#undef RS_HEADER_ENTRY
80 // Deal with rs_graphics.rsh special case
Shih-wei Liaob81c6a42010-10-10 14:15:00 -070081 if (::strcmp(File, "rs_graphics."RS_HEADER_SUFFIX) == 0)
Zonr Chang592a9542010-10-07 20:03:58 +080082 return true;
83 return false;
84}
85
Shih-wei Liaob81c6a42010-10-10 14:15:00 -070086SlangRS::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 Chang3a9ca1f2010-10-06 17:52:56 +080091 return;
92}
93
Shih-wei Liaob81c6a42010-10-10 14:15:00 -070094bool SlangRS::reflectToJava(const std::string &OutputPathBase,
95 const std::string &OutputPackageName,
96 std::string *RealPackageName) {
Zonr Chang3a9ca1f2010-10-06 17:52:56 +080097 if (mRSContext)
Shih-wei Liaob81c6a42010-10-10 14:15:00 -070098 return mRSContext->reflectToJava(OutputPathBase,
99 OutputPackageName,
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800100 getInputFileName(),
101 getOutputFileName(),
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700102 RealPackageName);
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800103 else
104 return false;
105}
106
Shih-wei Liaob81c6a42010-10-10 14:15:00 -0700107void SlangRS::reset() {
108 Slang::reset();
109 delete mRSContext;
110 mRSContext = NULL;
111 return;
Zonr Chang3a9ca1f2010-10-06 17:52:56 +0800112}
113
114SlangRS::~SlangRS() {
115 delete mRSContext;
116 return;
117}