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