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