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
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang.h"
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
196315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include <stdlib.h>
20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
218024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include <cstring>
228024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include <list>
238024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include <sstream>
24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <string>
258024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include <utility>
26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector>
278c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
28e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTConsumer.h"
29e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/AST/ASTContext.h"
30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
31be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "clang/Basic/DiagnosticIDs.h"
3223c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "clang/Basic/DiagnosticOptions.h"
33e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/FileManager.h"
34df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao#include "clang/Basic/FileSystemOptions.h"
358024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "clang/Basic/SourceLocation.h"
363a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/SourceManager.h"
373a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Basic/TargetInfo.h"
386315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Basic/TargetOptions.h"
39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
40cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/DependencyOutputOptions.h"
41cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/FrontendDiagnostic.h"
420e4ee65a2ba6b32fcd16c5d4a57fc7542d4032b4Stephen Hines#include "clang/Frontend/FrontendOptions.h"
4398cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar#include "clang/Frontend/PCHContainerOperations.h"
44e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Frontend/TextDiagnosticPrinter.h"
45cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines#include "clang/Frontend/Utils.h"
46cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
473a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang#include "clang/Lex/HeaderSearch.h"
4823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#include "clang/Lex/HeaderSearchOptions.h"
4998cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar#include "clang/Lex/Preprocessor.h"
5098cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar#include "clang/Lex/PreprocessorOptions.h"
513a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
526315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "clang/Parse/ParseAST.h"
536315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
548024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "clang/Sema/SemaDiagnostic.h"
558024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
56be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/ADT/IntrusiveRefCntPtr.h"
57be27482cdeaf08576bc39b72a15d35d13014a636Logan
58e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Bitcode/ReaderWriter.h"
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
6008df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang// More force linking
61ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray#include "llvm/Linker/Linker.h"
6208df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang
63e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// Force linking all passes/vmcore stuffs to libslang.so
640da7f6c8201b27938d3b9f048d71fd784cd1df9aStephen Hines#include "llvm/LinkAllIR.h"
65e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/LinkAllPasses.h"
66e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
67e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/raw_ostream.h"
68e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/MemoryBuffer.h"
69e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ErrorHandling.h"
70e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/Support/ManagedStatic.h"
71be27482cdeaf08576bc39b72a15d35d13014a636Logan#include "llvm/Support/Path.h"
729207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/TargetSelect.h"
739207a2e495c8363606861e4f034504ec5c153dabLogan Chien#include "llvm/Support/ToolOutputFile.h"
74e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
758024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "os_sep.h"
768024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "rs_cc_options.h"
776e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h"
78e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "slang_backend.h"
79b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao
808024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "slang_rs_context.h"
818024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "slang_rs_export_type.h"
828024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
838024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "slang_rs_reflection.h"
848024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#include "slang_rs_reflection_cpp.h"
858024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
868024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
8708df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Changnamespace {
8808df36e5c0a990306d958c9f6d59a5de23b748f6Zonr Chang
89b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainarstatic const char *kRSTriple32 = "renderscript32-none-linux-gnueabi";
90b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainarstatic const char *kRSTriple64 = "renderscript64-none-linux-gnueabi";
919ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines
92e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines}  // namespace
93e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
94e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang {
959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
968024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
978024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#define FS_SUFFIX  "fs"
988024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
998024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#define RS_HEADER_SUFFIX  "rsh"
1008024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
1018024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet/* RS_HEADER_ENTRY(name) */
1028024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#define ENUM_RS_HEADER()  \
103d118c0278865c0760a5c37972b57cc3a016d0952Pirama Arumuga Nainar  RS_HEADER_ENTRY(rs_allocation_create) \
1048024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_allocation_data) \
1058024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_atomic) \
1068024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_convert) \
1078024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_core) \
1088024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_debug) \
1098024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_for_each) \
1108024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_graphics) \
1118024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_graphics_types) \
1128024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_io) \
1138024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_math) \
1148024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_matrix) \
1158024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_object_info) \
1168024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_object_types) \
1178024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_quaternion) \
1188024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_time) \
1198024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_value_types) \
1208024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RS_HEADER_ENTRY(rs_vector_math) \
1218024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
1228024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// The named of metadata node that pragma resides (should be synced with
1249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// bcc.cpp)
125f52a620440fa62257dfdcf2583f0f9df5b855c76Shih-wei Liaoconst llvm::StringRef Slang::PragmaMetadataName = "#pragma";
126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
127b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainarstatic llvm::LLVMContext globalContext;
128b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainar
129b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainarllvm::LLVMContext &getGlobalLLVMContext() { return globalContext; }
130b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainar
1319207a2e495c8363606861e4f034504ec5c153dabLogan Chienstatic inline llvm::tool_output_file *
1329207a2e495c8363606861e4f034504ec5c153dabLogan ChienOpenOutputFile(const char *OutputFile,
133a1f95ee8df425089100148a42954cf61dc285015Stephen Hines               llvm::sys::fs::OpenFlags Flags,
1343eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines               std::error_code &EC,
135e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines               clang::DiagnosticsEngine *DiagEngine) {
1363eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines  slangAssert((OutputFile != nullptr) &&
1375abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes              (DiagEngine != nullptr) && "Invalid parameter!");
138e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
1393eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines  EC = llvm::sys::fs::create_directories(
1403eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines      llvm::sys::path::parent_path(OutputFile));
1413eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines  if (!EC) {
142e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang    llvm::tool_output_file *F =
1433eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines          new llvm::tool_output_file(OutputFile, EC, Flags);
1445abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes    if (F != nullptr)
145e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang      return F;
146e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  }
147e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
148e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Report error here.
1499207a2e495c8363606861e4f034504ec5c153dabLogan Chien  DiagEngine->Report(clang::diag::err_fe_error_opening)
1503eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines    << OutputFile << EC.message();
151e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
1525abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes  return nullptr;
153e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang}
154e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
1559ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hinesvoid Slang::createTarget(uint32_t BitWidth) {
1569ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  if (BitWidth == 64) {
1579ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines    mTargetOpts->Triple = kRSTriple64;
1589ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  } else {
1599ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines    mTargetOpts->Triple = kRSTriple32;
1609ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines  }
161b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao
1629207a2e495c8363606861e4f034504ec5c153dabLogan Chien  mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagEngine,
1637ac9d0de26d325071ad3f26f8d34514efca2d3d6Stephen Hines                                                    mTargetOpts));
164462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
165462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
1663a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createFileManager() {
167df5bcce1582d839eead432a5e24435236c90fb05Shih-wei Liao  mFileSysOpt.reset(new clang::FileSystemOptions());
168be27482cdeaf08576bc39b72a15d35d13014a636Logan  mFileMgr.reset(new clang::FileManager(*mFileSysOpt));
1693a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1703a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
1713a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createSourceManager() {
1729207a2e495c8363606861e4f034504ec5c153dabLogan Chien  mSourceMgr.reset(new clang::SourceManager(*mDiagEngine, *mFileMgr));
1733a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
1743a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
17568e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liaovoid Slang::createPreprocessor() {
1769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Default only search header file in current dir
17798cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(&getHeaderSearchOpts(),
178eeb251e8db802b836af7461d0f6eb1252c527ab8Stephen Hines                                                            *mSourceMgr,
1790444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines                                                            *mDiagEngine,
1800444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines                                                            LangOpts,
1810444de0c0e7cfc8d8f8fed6f64cd97812bdd6a41Stephen Hines                                                            mTarget.get());
1829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
18398cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  mPP.reset(new clang::Preprocessor(&getPreprocessorOpts(),
18423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines                                    *mDiagEngine,
1859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    LangOpts,
1869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                    *mSourceMgr,
1879207a2e495c8363606861e4f034504ec5c153dabLogan Chien                                    *HeaderInfo,
1889207a2e495c8363606861e4f034504ec5c153dabLogan Chien                                    *this,
1895abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes                                    nullptr,
1903a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang                                    /* OwnsHeaderSearch = */true));
1913fd0a94a5cf1656569b1aea07043cc63939dcb46Stephen Hines  // Initialize the preprocessor
19275d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines  mPP->Initialize(getTargetInfo());
1930e4ee65a2ba6b32fcd16c5d4a57fc7542d4032b4Stephen Hines  clang::FrontendOptions FEOpts;
19498cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar
19598cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  auto *Reader = mPCHContainerOperations->getReaderOrNull(
19698cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar      getHeaderSearchOpts().ModuleFormat);
19798cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  clang::InitializePreprocessor(*mPP, getPreprocessorOpts(), *Reader, FEOpts);
19898cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar
19998cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  clang::ApplyHeaderSearchOptions(*HeaderInfo, getHeaderSearchOpts(), LangOpts,
20098cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar      mPP->getTargetInfo().getTriple());
2010e4ee65a2ba6b32fcd16c5d4a57fc7542d4032b4Stephen Hines
20268e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao  mPragmas.clear();
20368e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao
2049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::vector<clang::DirectoryLookup> SearchList;
2053a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) {
2069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    if (const clang::DirectoryEntry *DE =
207be27482cdeaf08576bc39b72a15d35d13014a636Logan            mFileMgr->getDirectory(mIncludePaths[i])) {
2089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      SearchList.push_back(clang::DirectoryLookup(DE,
2099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                  clang::SrcMgr::C_System,
2109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                                                  false));
2119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
2129089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao  }
2139089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao
2149207a2e495c8363606861e4f034504ec5c153dabLogan Chien  HeaderInfo->SetSearchPaths(SearchList,
2159207a2e495c8363606861e4f034504ec5c153dabLogan Chien                             /* angledDirIdx = */1,
2169207a2e495c8363606861e4f034504ec5c153dabLogan Chien                             /* systemDixIdx = */1,
2179207a2e495c8363606861e4f034504ec5c153dabLogan Chien                             /* noCurDirSearch = */false);
2189089828a995422a5ed3beeed0890b755c4abe188Shih-wei Liao
2193a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  initPreprocessor();
22068e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao}
22168e8e9f98730b3672fb96d49e33b9db70a90ed3fShih-wei Liao
2223a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changvoid Slang::createASTContext() {
2238024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  mASTContext.reset(
2248024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      new clang::ASTContext(LangOpts, *mSourceMgr, mPP->getIdentifierTable(),
2258024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                            mPP->getSelectorTable(), mPP->getBuiltinInfo()));
22675d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines  mASTContext->InitBuiltinTypes(getTargetInfo());
2273a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  initASTContext();
2283a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
2293a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
2309207a2e495c8363606861e4f034504ec5c153dabLogan Chienclang::ASTConsumer *
2312770d0e31ef3b14cd51ca07273240ad0995dc5cdDavid GrossSlang::createBackend(const RSCCOptions &Opts, const clang::CodeGenOptions &CodeGenOpts,
2325309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                     llvm::raw_ostream *OS, OutputType OT) {
23398cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  auto *B = new Backend(mRSContext, &getDiagnostics(), Opts,
23498cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar                        getHeaderSearchOpts(), getPreprocessorOpts(),
23598cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar                        CodeGenOpts, getTargetOptions(), &mPragmas, OS, OT,
23698cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar                        getSourceManager(), mAllowRSPrefix, mIsFilterscript);
23798cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  B->Initialize(getASTContext());
23898cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar  return B;
2393a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang}
2403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
2415309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc BrouilletSlang::Slang(uint32_t BitWidth, clang::DiagnosticsEngine *DiagEngine,
2425309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet             DiagnosticBuffer *DiagClient)
2435309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    : mDiagEngine(DiagEngine), mDiagClient(DiagClient),
24498cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar      mTargetOpts(new clang::TargetOptions()),
24598cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar      mHSOpts(new clang::HeaderSearchOptions()),
24698cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar      mPPOpts(new clang::PreprocessorOptions()),
24798cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar      mPCHContainerOperations(std::make_shared<clang::PCHContainerOperations>()),
24898cfae456bb1831336bce2b21979a04e2e31fed4Pirama Arumuga Nainar      mOT(OT_Default), mRSContext(nullptr), mAllowRSPrefix(false), mTargetAPI(0),
2498024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      mVerbose(false), mIsFilterscript(false) {
2505309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // Please refer to include/clang/Basic/LangOptions.h to setup
2515309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // the options.
2525309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  LangOpts.RTTI = 0;  // Turn off the RTTI information support
2535309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  LangOpts.LineComment = 1;
2545309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  LangOpts.C99 = 1;
255b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainar  LangOpts.RenderScript = 1;
2565309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  LangOpts.LaxVectorConversions = 0;  // Do not bitcast vectors!
2575309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  LangOpts.CharIsSigned = 1;  // Signed char is our default.
2585309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
2595309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  CodeGenOpts.OptimizationLevel = 3;
2605309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet
261fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines  // We must set StackRealignment, because the default is for the actual
262fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines  // Clang driver to pass this option (-mstackrealign) directly to cc1.
263fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines  // Since we don't use Clang's driver, we need to similarly supply it.
264fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines  // If StackRealignment is zero (i.e. the option wasn't set), then the
265fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines  // backend assumes that it can't adjust the stack in any way, which breaks
266fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines  // alignment for vector loads/stores.
267fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines  CodeGenOpts.StackRealignment = 1;
268fac3b024d115fa1a71f3f7e0b7b29a9b03f9b436Stephen Hines
2695309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  createTarget(BitWidth);
2705309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  createFileManager();
2715309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  createSourceManager();
272641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang}
273641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
2748024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc BrouilletSlang::~Slang() {
2758024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  delete mRSContext;
2768024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  for (ReflectedDefinitionListTy::iterator I = ReflectedDefinitions.begin(),
2778024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                                           E = ReflectedDefinitions.end();
2788024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet       I != E; I++) {
2798024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    delete I->getValue().first;
2808024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
2818024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
2828024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
28323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hinesclang::ModuleLoadResult Slang::loadModule(
28423c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    clang::SourceLocation ImportLoc,
28523c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    clang::ModuleIdPath Path,
28623c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    clang::Module::NameVisibilityKind Visibility,
28723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines    bool IsInclusionDirective) {
2889207a2e495c8363606861e4f034504ec5c153dabLogan Chien  slangAssert(0 && "Not implemented");
28923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines  return clang::ModuleLoadResult();
290462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
291462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2923a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setInputSource(llvm::StringRef InputFile) {
2933a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mInputFileName = InputFile.str();
294462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
2959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mSourceMgr->clearIDTables();
296462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
297be27482cdeaf08576bc39b72a15d35d13014a636Logan  const clang::FileEntry *File = mFileMgr->getFile(InputFile);
29875d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines  if (File) {
29975d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines    mSourceMgr->setMainFileID(mSourceMgr->createFileID(File,
30075d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines        clang::SourceLocation(), clang::SrcMgr::C_User));
30175d471819f1810e0e65224d6e57fe1106af0d340Stephen Hines  }
302462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  if (mSourceMgr->getMainFileID().isInvalid()) {
3049207a2e495c8363606861e4f034504ec5c153dabLogan Chien    mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile;
3059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
3069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
307462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
309462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
310462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3113a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Changbool Slang::setOutput(const char *OutputFile) {
3123eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines  std::error_code EC;
3135abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes  llvm::tool_output_file *OS = nullptr;
314462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3153a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  switch (mOT) {
316cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines    case OT_Dependency:
3173a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_Assembly:
3183a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_LLVMAssembly: {
3193eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines      OS = OpenOutputFile(OutputFile, llvm::sys::fs::F_Text, EC, mDiagEngine);
3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
321462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
3223a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_Nothing: {
3239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
324462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
3253a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang    case OT_Object:
326cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines    case OT_Bitcode: {
3273eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines      OS = OpenOutputFile(OutputFile, llvm::sys::fs::F_None, EC, mDiagEngine);
3289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
3299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
3308c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    default: {
331cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines      llvm_unreachable("Unknown compiler output type");
3328c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang    }
3339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
334462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3353eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines  if (EC)
3369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return false;
337e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
338e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mOS.reset(OS);
3399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
3403a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  mOutputFileName = OutputFile;
341462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  return true;
343462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
344462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
3450b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hinesbool Slang::setDepOutput(const char *OutputFile) {
3463eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines  std::error_code EC;
3478c6d9b2d36ed2d6d811279fd9bddc05fffe16803Zonr Chang
348a1f95ee8df425089100148a42954cf61dc285015Stephen Hines  mDOS.reset(
3493eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines      OpenOutputFile(OutputFile, llvm::sys::fs::F_Text, EC, mDiagEngine));
3503eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines  if (EC || (mDOS.get() == nullptr))
3510b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines    return false;
3520b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines
3530b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  mDepOutputFileName = OutputFile;
3540b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines
3550b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  return true;
3560b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines}
3570b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines
35821c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wangint Slang::generateDepFile(bool PhonyTarget) {
3599207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (mDiagEngine->hasErrorOccurred())
360be27482cdeaf08576bc39b72a15d35d13014a636Logan    return 1;
3615abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes  if (mDOS.get() == nullptr)
362f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines    return 1;
363cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
364e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Initialize options for generating dependency file
365cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  clang::DependencyOutputOptions DepOpts;
366cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  DepOpts.IncludeSystemHeaders = 1;
36721c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang  if (PhonyTarget)
36821c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang    DepOpts.UsePhonyTargets = 1;
3690b7ef1a176b9ddd1e0d437efdce20743373fd7dbStephen Hines  DepOpts.OutputFile = mDepOutputFileName;
370b81c6a4cbd9c08e0b20ea4fbc615b416ac1bc9ecShih-wei Liao  DepOpts.Targets = mAdditionalDepTargets;
371cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  DepOpts.Targets.push_back(mDepTargetBCFileName);
3724cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  for (std::vector<std::string>::const_iterator
3734cc67fce91f43215d61b2695746eab102a3db516Stephen Hines           I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end();
3744cc67fce91f43215d61b2695746eab102a3db516Stephen Hines       I != E;
3754cc67fce91f43215d61b2695746eab102a3db516Stephen Hines       I++) {
3764cc67fce91f43215d61b2695746eab102a3db516Stephen Hines    DepOpts.Targets.push_back(*I);
3774cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  }
3784cc67fce91f43215d61b2695746eab102a3db516Stephen Hines  mGeneratedFileNames.clear();
379cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
380e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Per-compilation needed initialization
381cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  createPreprocessor();
382ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray  clang::DependencyFileGenerator::CreateAndAttachToPreprocessor(*mPP.get(), DepOpts);
383cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
384e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Inform the diagnostic client we are processing a source file
385cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mDiagClient->BeginSourceFile(LangOpts, mPP.get());
386cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
387e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Go through the source file (no operations necessary)
388cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  clang::Token Tok;
389cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mPP->EnterMainSourceFile();
390cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  do {
391cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines    mPP->Lex(Tok);
392cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  } while (Tok.isNot(clang::tok::eof));
393cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
394cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mPP->EndSourceFile();
395cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
396e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Declare success if no error
3979207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (!mDiagEngine->hasErrorOccurred())
398e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang    mDOS->keep();
399e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
400e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Clean up after compilation
401cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines  mPP.reset();
402e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mDOS.reset();
403cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
4049207a2e495c8363606861e4f034504ec5c153dabLogan Chien  return mDiagEngine->hasErrorOccurred() ? 1 : 0;
405cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines}
406cc0efad052e944f64bb71cfdaa8a825e30192e78Stephen Hines
4072770d0e31ef3b14cd51ca07273240ad0995dc5cdDavid Grossint Slang::compile(const RSCCOptions &Opts) {
4089207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (mDiagEngine->hasErrorOccurred())
409be27482cdeaf08576bc39b72a15d35d13014a636Logan    return 1;
4105abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes  if (mOS.get() == nullptr)
411f7de85223c8728d5dc147e8a19ddf039da72b431Stephen Hines    return 1;
412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Here is per-compilation needed initialization
4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  createPreprocessor();
4159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  createASTContext();
4163a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang
4172770d0e31ef3b14cd51ca07273240ad0995dc5cdDavid Gross  mBackend.reset(createBackend(Opts, CodeGenOpts, &mOS->os(), mOT));
418462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // Inform the diagnostic client we are processing a source file
4209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mDiagClient->BeginSourceFile(LangOpts, mPP.get());
421462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  // The core of the slang compiler
4239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ParseAST(*mPP, mBackend.get(), *mASTContext);
424462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
425e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Inform the diagnostic client we are done with previous source file
426e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mDiagClient->EndSourceFile();
427e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
428e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  // Declare success if no error
4299207a2e495c8363606861e4f034504ec5c153dabLogan Chien  if (!mDiagEngine->hasErrorOccurred())
430e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang    mOS->keep();
431e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang
4323a9ca1f0d6bd8f12c2bb2adea51f95c255996180Zonr Chang  // The compilation ended, clear
4339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mBackend.reset();
434e8c263a1c5df81594cf302ecadd813909c894487Zonr Chang  mOS.reset();
435462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4369207a2e495c8363606861e4f034504ec5c153dabLogan Chien  return mDiagEngine->hasErrorOccurred() ? 1 : 0;
437462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
438462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
439c460b37ffb50819a32c2a8967754b6f784b28263mkopecvoid Slang::setDebugMetadataEmission(bool EmitDebug) {
44043730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao  if (EmitDebug)
441b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainar    CodeGenOpts.setDebugInfo(clang::codegenoptions::FullDebugInfo);
44243730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao  else
443b6a143562bda2117824a0515c208504e9a2830f1Pirama Arumuga Nainar    CodeGenOpts.setDebugInfo(clang::codegenoptions::NoDebugInfo);
444c460b37ffb50819a32c2a8967754b6f784b28263mkopec}
445c460b37ffb50819a32c2a8967754b6f784b28263mkopec
446c460b37ffb50819a32c2a8967754b6f784b28263mkopecvoid Slang::setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel) {
447c460b37ffb50819a32c2a8967754b6f784b28263mkopec  CodeGenOpts.OptimizationLevel = OptimizationLevel;
448c460b37ffb50819a32c2a8967754b6f784b28263mkopec}
449c460b37ffb50819a32c2a8967754b6f784b28263mkopec
4508024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletbool Slang::isFilterscript(const char *Filename) {
4518024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  const char *c = strrchr(Filename, '.');
4528024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (c && !strncmp(FS_SUFFIX, c + 1, strlen(FS_SUFFIX) + 1)) {
4538024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return true;
4548024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  } else {
4558024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return false;
4568024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
4578024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
4588024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4598024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletbool Slang::generateJavaBitcodeAccessor(const std::string &OutputPathBase,
4608024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                                          const std::string &PackageName,
4618024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                                          const std::string *LicenseNote) {
4628024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RSSlangReflectUtils::BitCodeAccessorContext BCAccessorContext;
4638024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4648024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  BCAccessorContext.rsFileName = getInputFileName().c_str();
4655309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  BCAccessorContext.bc32FileName = mOutput32FileName.c_str();
4665309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  BCAccessorContext.bc64FileName = mOutputFileName.c_str();
4678024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  BCAccessorContext.reflectPath = OutputPathBase.c_str();
4688024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  BCAccessorContext.packageName = PackageName.c_str();
4698024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  BCAccessorContext.licenseNote = LicenseNote;
4708024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  BCAccessorContext.bcStorage = BCST_JAVA_CODE;   // Must be BCST_JAVA_CODE
4718024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  BCAccessorContext.verbose = false;
4728024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4738024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  return RSSlangReflectUtils::GenerateJavaBitCodeAccessor(BCAccessorContext);
4748024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
4758024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4768024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletbool Slang::checkODR(const char *CurInputFile) {
4778024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  for (RSContext::ExportableList::iterator I = mRSContext->exportable_begin(),
4788024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          E = mRSContext->exportable_end();
4798024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet       I != E;
4808024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet       I++) {
4818024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    RSExportable *RSE = *I;
4828024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (RSE->getKind() != RSExportable::EX_TYPE)
4838024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      continue;
4848024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4858024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    RSExportType *ET = static_cast<RSExportType *>(RSE);
4868024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (ET->getClass() != RSExportType::ExportClassRecord)
4878024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      continue;
4888024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4898024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    RSExportRecordType *ERT = static_cast<RSExportRecordType *>(ET);
4908024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4918024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    // Artificial record types (create by us not by user in the source) always
4928024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    // conforms the ODR.
4938024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (ERT->isArtificial())
4948024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      continue;
4958024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
4968024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    // Key to lookup ERT in ReflectedDefinitions
4978024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    llvm::StringRef RDKey(ERT->getName());
4988024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    ReflectedDefinitionListTy::const_iterator RD =
4998024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        ReflectedDefinitions.find(RDKey);
5008024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5018024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (RD != ReflectedDefinitions.end()) {
5028024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      const RSExportRecordType *Reflected = RD->getValue().first;
503ef1707027a18ed0d91a3854476db71024ae0e6daI-Jui (Ray) Sung
504ef1707027a18ed0d91a3854476db71024ae0e6daI-Jui (Ray) Sung      // See RSExportRecordType::matchODR for the logic
505ef1707027a18ed0d91a3854476db71024ae0e6daI-Jui (Ray) Sung      if (!Reflected->matchODR(ERT, true)) {
5065309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        unsigned DiagID = mDiagEngine->getCustomDiagID(
5075309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet            clang::DiagnosticsEngine::Error,
5085309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet            "type '%0' in different translation unit (%1 v.s. %2) "
5095309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet            "has incompatible type definition");
5105309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        getDiagnostics().Report(DiagID) << Reflected->getName()
5115309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                        << getInputFileName()
5125309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                        << RD->getValue().second;
5138024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        return false;
5148024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      }
5158024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    } else {
5168024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      llvm::StringMapEntry<ReflectedDefinitionTy> *ME =
5178024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          llvm::StringMapEntry<ReflectedDefinitionTy>::Create(RDKey);
5188024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      ME->setValue(std::make_pair(ERT, CurInputFile));
5198024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5203f45a25c23fa0f2cca4070f4d8713dc1a83f5ff7Matt Wala      if (!ReflectedDefinitions.insert(ME)) {
5213f45a25c23fa0f2cca4070f4d8713dc1a83f5ff7Matt Wala        slangAssert(false && "Type shouldn't be in map yet!");
5223f45a25c23fa0f2cca4070f4d8713dc1a83f5ff7Matt Wala      }
5238024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5248024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      // Take the ownership of ERT such that it won't be freed in ~RSContext().
5258024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      ERT->keep();
5268024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    }
5278024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
5288024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  return true;
5298024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
5308024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5318024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletvoid Slang::initPreprocessor() {
5328024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  clang::Preprocessor &PP = getPreprocessor();
5338024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5348024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  std::stringstream RSH;
5358024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RSH << PP.getPredefines();
5368024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RSH << "#define RS_VERSION " << mTargetAPI << "\n";
5378024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  RSH << "#include \"rs_core." RS_HEADER_SUFFIX "\"\n";
5388024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  PP.setPredefines(RSH.str());
5398024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
5408024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5418024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletvoid Slang::initASTContext() {
5428024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  mRSContext = new RSContext(getPreprocessor(),
5438024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                             getASTContext(),
5448024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                             getTargetInfo(),
5458024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                             &mPragmas,
5468024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                             mTargetAPI,
5478024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                             mVerbose);
5488024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
5498024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5508024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletbool Slang::IsRSHeaderFile(const char *File) {
5518024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#define RS_HEADER_ENTRY(name)  \
5528024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (::strcmp(File, #name "." RS_HEADER_SUFFIX) == 0)  \
5538024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return true;
5548024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc BrouilletENUM_RS_HEADER()
5558024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet#undef RS_HEADER_ENTRY
5568024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  return false;
5578024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
5588024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5598024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletbool Slang::IsLocInRSHeaderFile(const clang::SourceLocation &Loc,
5608024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                                  const clang::SourceManager &SourceMgr) {
5618024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  clang::FullSourceLoc FSL(Loc, SourceMgr);
5628024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  clang::PresumedLoc PLoc = SourceMgr.getPresumedLoc(FSL);
5638024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5648024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  const char *Filename = PLoc.getFilename();
5658024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (!Filename) {
5668024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return false;
5678024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  } else {
5688024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return IsRSHeaderFile(llvm::sys::path::filename(Filename).data());
5698024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
5708024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet}
5718024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5728024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouilletbool Slang::compile(
5738024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    const std::list<std::pair<const char*, const char*> > &IOFiles64,
5748024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    const std::list<std::pair<const char*, const char*> > &IOFiles32,
5758024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    const std::list<std::pair<const char*, const char*> > &DepFiles,
5765309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    const RSCCOptions &Opts,
5775309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    clang::DiagnosticOptions &DiagOpts) {
5788024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (IOFiles32.empty())
5798024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return true;
5808024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5818024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (Opts.mEmitDependency && (DepFiles.size() != IOFiles32.size())) {
5825309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    unsigned DiagID = mDiagEngine->getCustomDiagID(
5835309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        clang::DiagnosticsEngine::Error,
5845309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        "invalid parameter for output dependencies files.");
5855309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    getDiagnostics().Report(DiagID);
5868024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return false;
5878024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
5888024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5898024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (Opts.mEmit3264 && (IOFiles64.size() != IOFiles32.size())) {
5908024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    slangAssert(false && "Should have equal number of 32/64-bit files");
5918024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return false;
5928024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
5938024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5948024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  std::string RealPackageName;
5958024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5968024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  const char *InputFile, *Output64File, *Output32File, *BCOutputFile,
5978024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet             *DepOutputFile;
5988024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
5998024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  setIncludePaths(Opts.mIncludePaths);
6008024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  setOutputType(Opts.mOutputType);
6018024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (Opts.mEmitDependency) {
6028024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    setAdditionalDepTargets(Opts.mAdditionalDepTargets);
6038024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
6048024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6058024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  setDebugMetadataEmission(Opts.mDebugEmission);
6068024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6078024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  setOptimizationLevel(Opts.mOptimizationLevel);
6088024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6098024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  mAllowRSPrefix = Opts.mAllowRSPrefix;
6108024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6118024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  mTargetAPI = Opts.mTargetAPI;
6128024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  if (mTargetAPI != SLANG_DEVELOPMENT_TARGET_API &&
6138024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      (mTargetAPI < SLANG_MINIMUM_TARGET_API ||
6148024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet       mTargetAPI > SLANG_MAXIMUM_TARGET_API)) {
6155309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    unsigned DiagID = mDiagEngine->getCustomDiagID(
6165309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        clang::DiagnosticsEngine::Error,
6175309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet        "target API level '%0' is out of range ('%1' - '%2')");
6185309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    getDiagnostics().Report(DiagID) << mTargetAPI << SLANG_MINIMUM_TARGET_API
6195309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                    << SLANG_MAXIMUM_TARGET_API;
6208024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    return false;
6218024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
6228024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
623bd0a7ddceac6c135ea975cefbac73877a1f9dae7Stephen Hines  if (mTargetAPI >= SLANG_M_TARGET_API) {
624dbdaecf5f71ead9b71d9bd43a129427ffb53dd38Stephen Hines    LangOpts.NativeHalfArgsAndReturns = 1;
625e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar    LangOpts.NativeHalfType = 1;
626e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar    LangOpts.HalfArgsAndReturns = 1;
627e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar  }
628e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar
6298024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  mVerbose = Opts.mVerbose;
6308024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6318024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  // Skip generation of warnings a second time if we are doing more than just
6328024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  // a single pass over the input file.
6338024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  bool SuppressAllWarnings = (Opts.mOutputType != Slang::OT_Dependency);
6348024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6355309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  std::list<std::pair<const char*, const char*> >::const_iterator
6365309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      IOFile64Iter = IOFiles64.begin(),
6375309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      IOFile32Iter = IOFiles32.begin(),
6385309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      DepFileIter = DepFiles.begin();
6398024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6408024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  for (unsigned i = 0, e = IOFiles32.size(); i != e; i++) {
6418024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    InputFile = IOFile64Iter->first;
6428024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    Output64File = IOFile64Iter->second;
6438024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    Output32File = IOFile32Iter->second;
6448024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6458024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (!setInputSource(InputFile))
6468024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      return false;
6478024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6488024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (!setOutput(Output64File))
6498024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      return false;
6508024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6515309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    // For use with 64-bit compilation/reflection. This only sets the filename of
6525309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    // the 32-bit bitcode file, and doesn't actually verify it already exists.
6535309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    mOutput32FileName = Output32File;
6548024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6558024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    mIsFilterscript = isFilterscript(InputFile);
6568024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
65768e562f8cac58df367861670e554c3c1f498426cStephen McGroarty    CodeGenOpts.MainFileName = mInputFileName;
65868e562f8cac58df367861670e554c3c1f498426cStephen McGroarty
6592770d0e31ef3b14cd51ca07273240ad0995dc5cdDavid Gross    if (Slang::compile(Opts) > 0)
6608024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      return false;
6618024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6628024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (!Opts.mJavaReflectionPackageName.empty()) {
6638024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      mRSContext->setReflectJavaPackageName(Opts.mJavaReflectionPackageName);
6648024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    }
6658024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    const std::string &RealPackageName =
6668024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        mRSContext->getReflectJavaPackageName();
6678024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6688024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    bool doReflection = true;
6698024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (Opts.mEmit3264 && (Opts.mBitWidth == 32)) {
6708024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      // Skip reflection on the 32-bit path if we are going to emit it on the
6718024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      // 64-bit path.
6728024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      doReflection = false;
6738024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    }
6748024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (Opts.mOutputType != Slang::OT_Dependency && doReflection) {
6758024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
6768024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      if (Opts.mBitcodeStorage == BCST_CPP_CODE) {
6778024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        const std::string &outputFileName = (Opts.mBitWidth == 64) ?
6785309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                                            mOutputFileName : mOutput32FileName;
6798024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        RSReflectionCpp R(mRSContext, Opts.mJavaReflectionPathBase,
6808024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                          getInputFileName(), outputFileName);
6818024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        if (!R.reflect()) {
6828024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet            return false;
6838024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        }
6848024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      } else {
6858024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        if (!Opts.mRSPackageName.empty()) {
6868024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          mRSContext->setRSPackageName(Opts.mRSPackageName);
6878024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        }
6888024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
689ff5abc6892aedb25215689bd679eb7cc1588a8e3Jean-Luc Brouillet        std::vector<std::string> generatedFileNames;
690ff5abc6892aedb25215689bd679eb7cc1588a8e3Jean-Luc Brouillet        RSReflectionJava R(mRSContext, &generatedFileNames,
6918024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                           Opts.mJavaReflectionPathBase, getInputFileName(),
6925309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet                           mOutputFileName,
6938024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                           Opts.mBitcodeStorage == BCST_JAVA_CODE);
6948024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        if (!R.reflect()) {
6958024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          // TODO Is this needed or will the error message have been printed
6968024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          // already? and why not for the C++ case?
6978024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          fprintf(stderr, "RSContext::reflectToJava : failed to do reflection "
6988024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                          "(%s)\n",
6998024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                  R.getLastError());
7008024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          return false;
7018024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        }
7028024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7038024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        for (std::vector<std::string>::const_iterator
704ff5abc6892aedb25215689bd679eb7cc1588a8e3Jean-Luc Brouillet                 I = generatedFileNames.begin(), E = generatedFileNames.end();
7058024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet             I != E;
7068024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet             I++) {
7078024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          std::string ReflectedName = RSSlangReflectUtils::ComputePackagedPath(
7088024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet              Opts.mJavaReflectionPathBase.c_str(),
7098024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet              (RealPackageName + OS_PATH_SEPARATOR_STR + *I).c_str());
7108024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          appendGeneratedFileName(ReflectedName + ".java");
7118024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        }
7128024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7138024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        if ((Opts.mOutputType == Slang::OT_Bitcode) &&
7148024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet            (Opts.mBitcodeStorage == BCST_JAVA_CODE) &&
7158024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet            !generateJavaBitcodeAccessor(Opts.mJavaReflectionPathBase,
7168024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                                         RealPackageName.c_str(),
7178024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet                                         mRSContext->getLicenseNote())) {
7188024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet          return false;
7198024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        }
7208024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      }
7218024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    }
7228024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7238024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (Opts.mEmitDependency) {
7248024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      BCOutputFile = DepFileIter->first;
7258024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      DepOutputFile = DepFileIter->second;
7268024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7278024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      setDepTargetBC(BCOutputFile);
7288024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7298024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      if (!setDepOutput(DepOutputFile))
7308024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        return false;
7318024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7328024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      if (SuppressAllWarnings) {
7338024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        getDiagnostics().setSuppressAllDiagnostics(true);
7348024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      }
73521c94c9b4cc3c139c0d2c08f81e773aa3e269cffYing Wang      if (generateDepFile(Opts.mEmitPhonyDependency) > 0)
7368024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        return false;
7378024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      if (SuppressAllWarnings) {
7388024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet        getDiagnostics().setSuppressAllDiagnostics(false);
7398024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      }
7408024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7418024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      DepFileIter++;
7428024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    }
7438024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7448024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    if (!checkODR(InputFile))
7458024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet      return false;
7468024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet
7478024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    IOFile64Iter++;
7488024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet    IOFile32Iter++;
7498024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  }
7508024ed54c23c08534434da14d3be99c3efcc5754Jean-Luc Brouillet  return true;
751462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
752e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
753e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines}  // namespace slang
754