slang_rs.cpp revision c383a500aa59423264811be3874461bf8adbfea0
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
173a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs.h"
183a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
19b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao#include <cstring>
20b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao
213a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Sema/SemaDiagnostic.h"
223a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
233a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs_backend.h"
243a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs_context.h"
253a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
263a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changusing namespace slang;
273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
283c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_SUFFIX  "rsh"
293c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
303c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define ENUM_RS_HEADER()  \
313c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RS_HEADER_ENTRY(rs_types) \
323c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RS_HEADER_ENTRY(rs_cl) \
333c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RS_HEADER_ENTRY(rs_core) \
343c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RS_HEADER_ENTRY(rs_math)
353c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
363c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_ENTRY(x)  \
373c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  extern const char x ## _header[]; \
383c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  extern unsigned x ## _header_size;
393c250c5d6cbf4123e959a3466990fda9fa50987aZonr ChangENUM_RS_HEADER()
403c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#undef RS_HEADER_ENTRY
413c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
423a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initDiagnostic() {
433a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  clang::Diagnostic &Diag = getDiagnostics();
443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  if (!Diag.setDiagnosticGroupMapping(
453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang        "implicit-function-declaration", clang::diag::MAP_ERROR))
463a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    assert(false && "Unable to find option group "
473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang        "implicit-function-declaration");
483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  Diag.setDiagnosticMapping(
493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang      clang::diag::ext_typecheck_convert_discards_qualifiers,
503a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang      clang::diag::MAP_ERROR);
513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
523a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
533a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
543a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initPreprocessor() {
553a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  clang::Preprocessor &PP = getPreprocessor();
563a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
573c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  std::string RSH;
583c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_ENTRY(x)  \
593c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RSH.append("#line 1 \"" #x "."RS_HEADER_SUFFIX"\"\n"); \
603c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  RSH.append(x ## _header, x ## _header_size);
613c250c5d6cbf4123e959a3466990fda9fa50987aZonr ChangENUM_RS_HEADER()
623c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#undef RS_HEADER_ENTRY
633c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang  PP.setPredefines(RSH);
643c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang
653a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
663a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
673a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
683a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initASTContext() {
693a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mRSContext = new RSContext(&getPreprocessor(),
703a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                             &getASTContext(),
713a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                             &getTargetInfo());
723a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
733a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
753a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclang::ASTConsumer
763a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang*SlangRS::createBackend(const clang::CodeGenOptions& CodeGenOpts,
773a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                        llvm::raw_ostream *OS,
783a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                        Slang::OutputType OT) {
793a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    return new RSBackend(mRSContext,
803a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         getDiagnostics(),
813a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         CodeGenOpts,
823a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         getTargetOptions(),
833a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         mPragmas,
843a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         OS,
853a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         OT,
863a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         getSourceManager(),
873a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                         mAllowRSPrefix);
883a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
893a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
90592a954aae4cb946970b557e94afd5ee453fd57eZonr Changbool SlangRS::IsRSHeaderFile(const char *File) {
91592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang#define RS_HEADER_ENTRY(x)  \
92b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  if (::strcmp(File, #x "."RS_HEADER_SUFFIX) == 0)  \
93592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang    return true;
94592a954aae4cb946970b557e94afd5ee453fd57eZonr ChangENUM_RS_HEADER()
95592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang#undef RS_HEADER_ENTRY
96592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang  // Deal with rs_graphics.rsh special case
97b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  if (::strcmp(File, "rs_graphics."RS_HEADER_SUFFIX) == 0)
98592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang    return true;
99592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang  return false;
100592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang}
101592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang
102b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei LiaoSlangRS::SlangRS(const std::string &Triple, const std::string &CPU,
103b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                 const std::vector<std::string> &Features)
104b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao    : Slang(Triple, CPU, Features),
105b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao      mRSContext(NULL),
106b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao      mAllowRSPrefix(false) {
1073a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
1083a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1093a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
110b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaobool SlangRS::reflectToJava(const std::string &OutputPathBase,
111b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                            const std::string &OutputPackageName,
112b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                            std::string *RealPackageName) {
1133a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  if (mRSContext)
114b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao    return mRSContext->reflectToJava(OutputPathBase,
115b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                                     OutputPackageName,
1163a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                     getInputFileName(),
1173a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                     getOutputFileName(),
118b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao                                     RealPackageName);
1193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  else
1203a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    return false;
1213a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1223a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
123b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liaovoid SlangRS::reset() {
124b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  Slang::reset();
125b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  delete mRSContext;
126b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  mRSContext = NULL;
127b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  return;
1283a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
1303a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr ChangSlangRS::~SlangRS() {
1313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  delete mRSContext;
1323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  return;
1333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
134