1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 20a813a3ef2a82f19d7eab9e23ae8493197143803Stephen Hines * Copyright 2010-2012, 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> 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <list> 212e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines#include <sstream> 22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string> 23e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <utility> 24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector> 25fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines 26be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "clang/Basic/SourceLocation.h" 27be27482cdeaf08576bc39b72a15d35d13014a636Logan 28cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang#include "clang/Frontend/FrontendDiagnostic.h" 29cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 303a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Sema/SemaDiagnostic.h" 313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 32be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/Path.h" 33e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 348d5a2f6ab321615bfb3a46f68aff0b643a71caa0Raphael#include "os_sep.h" 357f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines#include "rs_cc_options.h" 363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs_backend.h" 373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "slang_rs_context.h" 38641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang#include "slang_rs_export_type.h" 393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 4012fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet#include "slang_rs_reflection.h" 411b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams#include "slang_rs_reflection_cpp.h" 421b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams 43e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 4511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines#define FS_SUFFIX "fs" 4611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 473c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define RS_HEADER_SUFFIX "rsh" 483c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang 492d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines/* RS_HEADER_ENTRY(name) */ 503c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang#define ENUM_RS_HEADER() \ 512d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_allocation) \ 522d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_atomic) \ 532d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_cl) \ 542d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_core) \ 55a7ab54d590b5a959354a654cccacf4337e7fd5b0Stephen Hines RS_HEADER_ENTRY(rs_core_math) \ 562d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_debug) \ 574eb4b38b35855436543d229bc3c83b60d47dbbceAlex Sakhartchouk RS_HEADER_ENTRY(rs_element) \ 582d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_graphics) \ 592d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_math) \ 604eb4b38b35855436543d229bc3c83b60d47dbbceAlex Sakhartchouk RS_HEADER_ENTRY(rs_mesh) \ 612d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_matrix) \ 622d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_object) \ 634eb4b38b35855436543d229bc3c83b60d47dbbceAlex Sakhartchouk RS_HEADER_ENTRY(rs_program) \ 642d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_quaternion) \ 654eb4b38b35855436543d229bc3c83b60d47dbbceAlex Sakhartchouk RS_HEADER_ENTRY(rs_sampler) \ 662d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_time) \ 672d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines RS_HEADER_ENTRY(rs_types) \ 682d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines 6911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines// Returns true if \p Filename ends in ".fs". 7011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hinesbool SlangRS::isFilterscript(const char *Filename) { 7111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines const char *c = strrchr(Filename, '.'); 7211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines if (c && !strncmp(FS_SUFFIX, c + 1, strlen(FS_SUFFIX) + 1)) { 7311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines return true; 7411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines } else { 7511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines return false; 7611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines } 7711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines} 783c250c5d6cbf4123e959a3466990fda9fa50987aZonr Chang 79129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouilletbool SlangRS::generateJavaBitcodeAccessor(const std::string &OutputPathBase, 8012fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet const std::string &PackageName, 8112fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet const std::string *LicenseNote) { 82cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang RSSlangReflectUtils::BitCodeAccessorContext BCAccessorContext; 83cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 84cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang BCAccessorContext.rsFileName = getInputFileName().c_str(); 859ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines BCAccessorContext.bc32FileName = getOutput32FileName().c_str(); 869ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines BCAccessorContext.bc64FileName = getOutputFileName().c_str(); 87cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang BCAccessorContext.reflectPath = OutputPathBase.c_str(); 88cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang BCAccessorContext.packageName = PackageName.c_str(); 89129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouillet BCAccessorContext.licenseNote = LicenseNote; 90cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang BCAccessorContext.bcStorage = BCST_JAVA_CODE; // Must be BCST_JAVA_CODE 919ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines BCAccessorContext.verbose = false; 92cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 93129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouillet return RSSlangReflectUtils::GenerateJavaBitCodeAccessor(BCAccessorContext); 94cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang} 95cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 96e86245a09bb8b9e72f5dc68083444ec938865798Zonr Changbool SlangRS::checkODR(const char *CurInputFile) { 97641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang for (RSContext::ExportableList::iterator I = mRSContext->exportable_begin(), 98641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang E = mRSContext->exportable_end(); 99641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang I != E; 100641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang I++) { 101a858cb6f3d9223d65bf73e1230c6324ded4095f6Stephen Hines RSExportable *RSE = *I; 102a858cb6f3d9223d65bf73e1230c6324ded4095f6Stephen Hines if (RSE->getKind() != RSExportable::EX_TYPE) 103641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang continue; 104641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 105a858cb6f3d9223d65bf73e1230c6324ded4095f6Stephen Hines RSExportType *ET = static_cast<RSExportType *>(RSE); 106641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (ET->getClass() != RSExportType::ExportClassRecord) 107641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang continue; 108641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 109641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang RSExportRecordType *ERT = static_cast<RSExportRecordType *>(ET); 110641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 111641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Artificial record types (create by us not by user in the source) always 112641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // conforms the ODR. 113641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (ERT->isArtificial()) 114641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang continue; 115641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 116641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Key to lookup ERT in ReflectedDefinitions 117641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang llvm::StringRef RDKey(ERT->getName()); 118641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ReflectedDefinitionListTy::const_iterator RD = 119641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ReflectedDefinitions.find(RDKey); 120641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 121641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (RD != ReflectedDefinitions.end()) { 122641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang const RSExportRecordType *Reflected = RD->getValue().first; 123641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // There's a record (struct) with the same name reflected before. Enforce 124641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // ODR checking - the Reflected must hold *exactly* the same "definition" 125641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // as the one defined previously. We say two record types A and B have the 126641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // same definition iff: 127641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // 128641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // struct A { struct B { 129641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Type(a1) a1, Type(b1) b1, 130641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Type(a2) a2, Type(b1) b2, 131641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // ... ... 132641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Type(aN) aN Type(b3) b3, 133641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // }; } 134641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Cond. #1. They have same number of fields, i.e., N = M; 135641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Cond. #2. for (i := 1 to N) 136641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Type(ai) = Type(bi) must hold; 137641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Cond. #3. for (i := 1 to N) 138641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Name(ai) = Name(bi) must hold; 139641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // 140641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // where, 141641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Type(F) = the type of field F and 142641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Name(F) = the field name. 143641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 144641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang bool PassODR = false; 145641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Cond. #1 and Cond. #2 146641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (Reflected->equals(ERT)) { 147641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Cond #3. 148641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang RSExportRecordType::const_field_iterator AI = Reflected->fields_begin(), 149641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang BI = ERT->fields_begin(); 150641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 151641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang for (unsigned i = 0, e = Reflected->getFields().size(); i != e; i++) { 152641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if ((*AI)->getName() != (*BI)->getName()) 153641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang break; 154641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang AI++; 155641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang BI++; 156641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 157641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang PassODR = (AI == (Reflected->fields_end())); 158641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 159641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 160641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (!PassODR) { 161641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang getDiagnostics().Report(mDiagErrorODR) << Reflected->getName() 162641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang << getInputFileName() 163641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang << RD->getValue().second; 164641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return false; 165641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 166641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } else { 167641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang llvm::StringMapEntry<ReflectedDefinitionTy> *ME = 1687ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines llvm::StringMapEntry<ReflectedDefinitionTy>::Create(RDKey); 169e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang ME->setValue(std::make_pair(ERT, CurInputFile)); 170641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 171641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang if (!ReflectedDefinitions.insert(ME)) 172641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang delete ME; 173641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 174641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang // Take the ownership of ERT such that it won't be freed in ~RSContext(). 175641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang ERT->keep(); 176641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 177641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 178641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return true; 179641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 180cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 1813a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initDiagnostic() { 1829207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine &DiagEngine = getDiagnostics(); 183cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 1847ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines if (DiagEngine.setSeverityForGroup("implicit-function-declaration", 1857ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines clang::diag::Severity::Error)) 1869207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine.Report(clang::diag::warn_unknown_warning_option) 1879207a2e495c8363606861e4f034504ec5c153dabLogan Chien << "implicit-function-declaration"; 1889207a2e495c8363606861e4f034504ec5c153dabLogan Chien 1897ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines DiagEngine.setSeverity( 1909207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::diag::ext_typecheck_convert_discards_qualifiers, 1917ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines clang::diag::Severity::Error, 1929207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::SourceLocation()); 193641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 194641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mDiagErrorInvalidOutputDepParameter = 1959207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine.getCustomDiagID( 1969207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine::Error, 1979207a2e495c8363606861e4f034504ec5c153dabLogan Chien "invalid parameter for output dependencies files."); 198641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 199641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mDiagErrorODR = 2009207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine.getCustomDiagID( 2019207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine::Error, 2029207a2e495c8363606861e4f034504ec5c153dabLogan Chien "type '%0' in different translation unit (%1 v.s. %2) " 2039207a2e495c8363606861e4f034504ec5c153dabLogan Chien "has incompatible type definition"); 2049207a2e495c8363606861e4f034504ec5c153dabLogan Chien 2059207a2e495c8363606861e4f034504ec5c153dabLogan Chien mDiagErrorTargetAPIRange = 2069207a2e495c8363606861e4f034504ec5c153dabLogan Chien DiagEngine.getCustomDiagID( 2079207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::DiagnosticsEngine::Error, 2082e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines "target API level '%0' is out of range ('%1' - '%2')"); 2093a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2103a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2113a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initPreprocessor() { 2123a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang clang::Preprocessor &PP = getPreprocessor(); 2133a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2142e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines std::stringstream RSH; 2150e4ee65a2ba6b32fcd16c5d4a57fc7542d4032b4Stephen Hines RSH << PP.getPredefines(); 2162968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet RSH << "#define RS_VERSION " << mTargetAPI << "\n"; 2172968921e1cedf85360964c5a39e1ce36c66ecd09Jean-Luc Brouillet RSH << "#include \"rs_core." RS_HEADER_SUFFIX "\"\n"; 2182e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines PP.setPredefines(RSH.str()); 2193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2203a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2213a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid SlangRS::initASTContext() { 2229e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines mRSContext = new RSContext(getPreprocessor(), 2239e5b503349719144f63ccb7c62ee9c291a7d83b8Stephen Hines getASTContext(), 2243fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines getTargetInfo(), 2254cc67fce91f43215d61b2695746eab102a3db516Stephen Hines &mPragmas, 226fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mTargetAPI, 227fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mVerbose); 2283a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2303a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changclang::ASTConsumer 2313a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang*SlangRS::createBackend(const clang::CodeGenOptions& CodeGenOpts, 2323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang llvm::raw_ostream *OS, 2333a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang Slang::OutputType OT) { 2343a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return new RSBackend(mRSContext, 235e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines &getDiagnostics(), 2363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang CodeGenOpts, 2373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang getTargetOptions(), 2383fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines &mPragmas, 2393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OS, 2403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang OT, 2413a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang getSourceManager(), 24211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines mAllowRSPrefix, 24311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines mIsFilterscript); 2443a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2453a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 246592a954aae4cb946970b557e94afd5ee453fd57eZonr Changbool SlangRS::IsRSHeaderFile(const char *File) { 2472d35eddd17eaa8bf5a0202dc60ead14dd16eb2d6Stephen Hines#define RS_HEADER_ENTRY(name) \ 248ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray if (::strcmp(File, #name "." RS_HEADER_SUFFIX) == 0) \ 249592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang return true; 250592a954aae4cb946970b557e94afd5ee453fd57eZonr ChangENUM_RS_HEADER() 251592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang#undef RS_HEADER_ENTRY 252592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang return false; 253592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang} 254592a954aae4cb946970b557e94afd5ee453fd57eZonr Chang 25511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hinesbool SlangRS::IsLocInRSHeaderFile(const clang::SourceLocation &Loc, 25611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines const clang::SourceManager &SourceMgr) { 25711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines clang::FullSourceLoc FSL(Loc, SourceMgr); 258fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines clang::PresumedLoc PLoc = SourceMgr.getPresumedLoc(FSL); 259fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines 260688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines const char *Filename = PLoc.getFilename(); 261688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines if (!Filename) { 262688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines return false; 263688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines } else { 264688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines return IsRSHeaderFile(llvm::sys::path::filename(Filename).data()); 265688e64b2d56e4218c680b9d6523c5de672f55757Stephen Hines } 266fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines} 267fcda2352b9e140529f8f3c89f05b10a70c0048b2Stephen Hines 2689207a2e495c8363606861e4f034504ec5c153dabLogan ChienSlangRS::SlangRS() 26911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines : Slang(), mRSContext(NULL), mAllowRSPrefix(false), mTargetAPI(0), 270fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mVerbose(false), mIsFilterscript(false) { 2713a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 2723a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 273cf6af6abc1de499920571308b14a27e19cf57097Zonr Changbool SlangRS::compile( 2749ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines const std::list<std::pair<const char*, const char*> > &IOFiles64, 2759ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines const std::list<std::pair<const char*, const char*> > &IOFiles32, 276cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang const std::list<std::pair<const char*, const char*> > &DepFiles, 2777f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines const RSCCOptions &Opts) { 2789ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines if (IOFiles32.empty()) 279cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang return true; 280cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 2819ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines if (Opts.mEmitDependency && (DepFiles.size() != IOFiles32.size())) { 282641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang getDiagnostics().Report(mDiagErrorInvalidOutputDepParameter); 2833a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang return false; 284cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang } 2853a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 2869ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines if (Opts.mEmit3264 && (IOFiles64.size() != IOFiles32.size())) { 2879ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines slangAssert(false && "Should have equal number of 32/64-bit files"); 2889ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines return false; 2899ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines } 2909ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines 291cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::string RealPackageName; 292cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 2939ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines const char *InputFile, *Output64File, *Output32File, *BCOutputFile, 2949ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines *DepOutputFile; 295cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang std::list<std::pair<const char*, const char*> >::const_iterator 2969ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines IOFile64Iter = IOFiles64.begin(), 2979ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines IOFile32Iter = IOFiles32.begin(), 2989ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines DepFileIter = DepFiles.begin(); 299cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3007f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines setIncludePaths(Opts.mIncludePaths); 3017f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines setOutputType(Opts.mOutputType); 3027f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines if (Opts.mEmitDependency) { 3037f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines setAdditionalDepTargets(Opts.mAdditionalDepTargets); 3044cc67fce91f43215d61b2695746eab102a3db516Stephen Hines } 305cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3067f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines setDebugMetadataEmission(Opts.mDebugEmission); 307c460b37ffb50819a32c2a8967754b6f784b28263mkopec 3087f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines setOptimizationLevel(Opts.mOptimizationLevel); 309c460b37ffb50819a32c2a8967754b6f784b28263mkopec 3107f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines mAllowRSPrefix = Opts.mAllowRSPrefix; 311cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3127f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines mTargetAPI = Opts.mTargetAPI; 3139e3aa07a4456aad52920e0a7464954fe67cdbe01Chris Wailes if (mTargetAPI != SLANG_DEVELOPMENT_TARGET_API && 3149e3aa07a4456aad52920e0a7464954fe67cdbe01Chris Wailes (mTargetAPI < SLANG_MINIMUM_TARGET_API || 3159e3aa07a4456aad52920e0a7464954fe67cdbe01Chris Wailes mTargetAPI > SLANG_MAXIMUM_TARGET_API)) { 3162e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines getDiagnostics().Report(mDiagErrorTargetAPIRange) << mTargetAPI 3174cc499d6e5ec602309501873449c938af61170b2Stephen Hines << SLANG_MINIMUM_TARGET_API << SLANG_MAXIMUM_TARGET_API; 3182e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines return false; 3192e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines } 3202e35b136cc2434080fcd682d2f95e53a87675dd4Stephen Hines 321fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines mVerbose = Opts.mVerbose; 322fc4f78b9c7941132fb048a83f0e4ba528c3b4fd0Stephen Hines 323c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines // Skip generation of warnings a second time if we are doing more than just 324c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines // a single pass over the input file. 3257f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines bool SuppressAllWarnings = (Opts.mOutputType != Slang::OT_Dependency); 326c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines 3272d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines bool CompileSecondTimeFor64Bit = Opts.mEmit3264 && Opts.mBitWidth == 64; 3282d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines 3299ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines for (unsigned i = 0, e = IOFiles32.size(); i != e; i++) { 3309ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines InputFile = IOFile64Iter->first; 3319ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines Output64File = IOFile64Iter->second; 3329ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines Output32File = IOFile32Iter->second; 333cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3342d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines // We suppress warnings (via reset) if we are doing a second compilation. 3352d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines reset(CompileSecondTimeFor64Bit); 336cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 337cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang if (!setInputSource(InputFile)) 338cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang return false; 339cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3409ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines if (!setOutput(Output64File)) 341cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang return false; 342cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3439ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines setOutput32(Output32File); 3449ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines 34511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines mIsFilterscript = isFilterscript(InputFile); 34611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 347cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang if (Slang::compile() > 0) 348cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang return false; 349cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3507f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines if (!Opts.mJavaReflectionPackageName.empty()) { 3517f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines mRSContext->setReflectJavaPackageName(Opts.mJavaReflectionPackageName); 352925879fa622dda293806ed25b1ee63d2f4a8d65aStephen Hines } 353925879fa622dda293806ed25b1ee63d2f4a8d65aStephen Hines const std::string &RealPackageName = 354925879fa622dda293806ed25b1ee63d2f4a8d65aStephen Hines mRSContext->getReflectJavaPackageName(); 355925879fa622dda293806ed25b1ee63d2f4a8d65aStephen Hines 3569ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines bool doReflection = true; 3579ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines if (Opts.mEmit3264 && (Opts.mBitWidth == 32)) { 3589ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines // Skip reflection on the 32-bit path if we are going to emit it on the 3599ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines // 64-bit path. 3609ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines doReflection = false; 3619ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines } 3629ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines if (Opts.mOutputType != Slang::OT_Dependency && doReflection) { 363cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 3647f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines if (Opts.mBitcodeStorage == BCST_CPP_CODE) { 3655984fc03b6189f19f3721423b92469e4908a49efStephen Hines const std::string &outputFileName = (Opts.mBitWidth == 64) ? 3665984fc03b6189f19f3721423b92469e4908a49efStephen Hines getOutputFileName() : getOutput32FileName(); 3675984fc03b6189f19f3721423b92469e4908a49efStephen Hines RSReflectionCpp R(mRSContext, Opts.mJavaReflectionPathBase, 3685984fc03b6189f19f3721423b92469e4908a49efStephen Hines getInputFileName(), outputFileName); 3695984fc03b6189f19f3721423b92469e4908a49efStephen Hines if (!R.reflect()) { 3701b6a0883cd6984e11e59b0c847fb334df1f41afcJason Sams return false; 3715984fc03b6189f19f3721423b92469e4908a49efStephen Hines } 3725c25c5159c0a5be9af992679067790716626da7bStephen Hines } else { 3737f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines if (!Opts.mRSPackageName.empty()) { 3747f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines mRSContext->setRSPackageName(Opts.mRSPackageName); 37512fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet } 3764cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 37759f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet RSReflectionJava R(mRSContext, &mGeneratedFileNames, 3787f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines Opts.mJavaReflectionPathBase, getInputFileName(), 37959f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet getOutputFileName(), 3807f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines Opts.mBitcodeStorage == BCST_JAVA_CODE); 38159f22c376b2c1cd109735280689224fadfe40b42Jean-Luc Brouillet if (!R.reflect()) { 38212fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet // TODO Is this needed or will the error message have been printed 38312fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet // already? and why not for the C++ case? 38412fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet fprintf(stderr, "RSContext::reflectToJava : failed to do reflection " 38512fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet "(%s)\n", 38612fc283f4108fd6f7f0164c121ff2f6fb5044225Jean-Luc Brouillet R.getLastError()); 3877fda9848f91fc5cca55f63423b35672128b6daabJean-Luc Brouillet return false; 3885c25c5159c0a5be9af992679067790716626da7bStephen Hines } 3895c25c5159c0a5be9af992679067790716626da7bStephen Hines 3905c25c5159c0a5be9af992679067790716626da7bStephen Hines for (std::vector<std::string>::const_iterator 3915c25c5159c0a5be9af992679067790716626da7bStephen Hines I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end(); 3925c25c5159c0a5be9af992679067790716626da7bStephen Hines I != E; 3935c25c5159c0a5be9af992679067790716626da7bStephen Hines I++) { 3945c25c5159c0a5be9af992679067790716626da7bStephen Hines std::string ReflectedName = RSSlangReflectUtils::ComputePackagedPath( 3957f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines Opts.mJavaReflectionPathBase.c_str(), 3965c25c5159c0a5be9af992679067790716626da7bStephen Hines (RealPackageName + OS_PATH_SEPARATOR_STR + *I).c_str()); 3975c25c5159c0a5be9af992679067790716626da7bStephen Hines appendGeneratedFileName(ReflectedName + ".java"); 3985c25c5159c0a5be9af992679067790716626da7bStephen Hines } 3995c25c5159c0a5be9af992679067790716626da7bStephen Hines 4007f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines if ((Opts.mOutputType == Slang::OT_Bitcode) && 4017f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines (Opts.mBitcodeStorage == BCST_JAVA_CODE) && 4027f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines !generateJavaBitcodeAccessor(Opts.mJavaReflectionPathBase, 403129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouillet RealPackageName.c_str(), 404129fd8228cd04592a20c3d5009805a23585f2479Jean-Luc Brouillet mRSContext->getLicenseNote())) { 4055c25c5159c0a5be9af992679067790716626da7bStephen Hines return false; 4065c25c5159c0a5be9af992679067790716626da7bStephen Hines } 4075c25c5159c0a5be9af992679067790716626da7bStephen Hines } 408cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang } 409cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 4107f5704efe0c59d5599f1ac7056976225dbfab946Stephen Hines if (Opts.mEmitDependency) { 4114cc67fce91f43215d61b2695746eab102a3db516Stephen Hines BCOutputFile = DepFileIter->first; 4124cc67fce91f43215d61b2695746eab102a3db516Stephen Hines DepOutputFile = DepFileIter->second; 4134cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 4144cc67fce91f43215d61b2695746eab102a3db516Stephen Hines setDepTargetBC(BCOutputFile); 4154cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 4164cc67fce91f43215d61b2695746eab102a3db516Stephen Hines if (!setDepOutput(DepOutputFile)) 4174cc67fce91f43215d61b2695746eab102a3db516Stephen Hines return false; 4184cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 419c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines if (SuppressAllWarnings) { 420c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines getDiagnostics().setSuppressAllDiagnostics(true); 421c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines } 4224cc67fce91f43215d61b2695746eab102a3db516Stephen Hines if (generateDepFile() > 0) 4234cc67fce91f43215d61b2695746eab102a3db516Stephen Hines return false; 424c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines if (SuppressAllWarnings) { 425c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines getDiagnostics().setSuppressAllDiagnostics(false); 426c632be206ac4fe49a5db05cfa54942d774329dbeStephen Hines } 4274cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 4284cc67fce91f43215d61b2695746eab102a3db516Stephen Hines DepFileIter++; 4294cc67fce91f43215d61b2695746eab102a3db516Stephen Hines } 4304cc67fce91f43215d61b2695746eab102a3db516Stephen Hines 431e86245a09bb8b9e72f5dc68083444ec938865798Zonr Chang if (!checkODR(InputFile)) 432641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return false; 433641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 4349ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines IOFile64Iter++; 4359ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines IOFile32Iter++; 436cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang } 437cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang 438cf6af6abc1de499920571308b14a27e19cf57097Zonr Chang return true; 4393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 4403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang 4412d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hinesvoid SlangRS::reset(bool SuppressWarnings) { 442641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang delete mRSContext; 443641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang mRSContext = NULL; 4444cc67fce91f43215d61b2695746eab102a3db516Stephen Hines mGeneratedFileNames.clear(); 4452d504fd03c66be56ac3b4bb62c78cc72c75dd8b6Stephen Hines Slang::reset(SuppressWarnings); 446641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 447641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 4483a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr ChangSlangRS::~SlangRS() { 4493a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang delete mRSContext; 450641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang for (ReflectedDefinitionListTy::iterator I = ReflectedDefinitions.begin(), 451641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang E = ReflectedDefinitions.end(); 452641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang I != E; 453641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang I++) { 454641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang delete I->getValue().first; 455641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 4563a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang} 457e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 458e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 459