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