slang.cpp revision c460b37ffb50819a32c2a8967754b6f784b28263
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2010, The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17767a662ecde33c3979bf02b793d392aca0403162Wink Saville#include "slang.h" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include <stdlib.h> 20b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <string> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <vector> 23599a90c2a02645a5f2d189b9065b863397a4076eWink Saville 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/AST/ASTConsumer.h" 25b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee#include "clang/AST/ASTContext.h" 26b55df4471ed55a0e91dee79304f3b1209ffa4b35Sang-il, Lee 27a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville#include "clang/Basic/DiagnosticIDs.h" 28b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "clang/Basic/FileManager.h" 29b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "clang/Basic/FileSystemOptions.h" 30b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "clang/Basic/LangOptions.h" 31b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "clang/Basic/SourceManager.h" 32b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "clang/Basic/TargetInfo.h" 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/Basic/TargetOptions.h" 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35145ff609de3206b585819ef974fab20cdc2d9f5eJake Hamby#include "clang/Frontend/CodeGenOptions.h" 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/Frontend/DiagnosticOptions.h" 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/Frontend/DependencyOutputOptions.h" 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/Frontend/FrontendDiagnostic.h" 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/Frontend/TextDiagnosticPrinter.h" 40767a662ecde33c3979bf02b793d392aca0403162Wink Saville#include "clang/Frontend/Utils.h" 41b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/Lex/Preprocessor.h" 43b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "clang/Lex/HeaderSearch.h" 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "clang/Parse/ParseAST.h" 46767a662ecde33c3979bf02b793d392aca0403162Wink Saville 47b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "llvm/ADT/IntrusiveRefCntPtr.h" 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "llvm/Bitcode/ReaderWriter.h" 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// More force linking 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "llvm/Linker.h" 53b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 54b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby// Force linking all passes/vmcore stuffs to libslang.so 55b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "llvm/LinkAllPasses.h" 56b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "llvm/LinkAllVMCore.h" 57b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 58141da403c0ad2d06b8f55e737ddf5d9e2b64c536bi#include "llvm/Support/raw_ostream.h" 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "llvm/Support/MemoryBuffer.h" 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "llvm/Support/ErrorHandling.h" 61b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "llvm/Support/ManagedStatic.h" 62b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "llvm/Support/Path.h" 63b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "llvm/Support/TargetSelect.h" 64141da403c0ad2d06b8f55e737ddf5d9e2b64c536bi#include "llvm/Support/ToolOutputFile.h" 65b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 66b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "slang_assert.h" 67b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "slang_backend.h" 68b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby#include "slang_utils.h" 69b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 70141da403c0ad2d06b8f55e737ddf5d9e2b64c536binamespace { 71b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 72b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambystruct ForceSlangLinking { 73b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby ForceSlangLinking() { 74b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // We must reference the functions in such a way that compilers will not 75b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // delete it all as dead code, even with whole program optimization, 76141da403c0ad2d06b8f55e737ddf5d9e2b64c536bi // yet is effectively a NO-OP. As the compiler isn't smart enough 77b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // to know that getenv() never returns -1, this will do the job. 78b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (std::getenv("bar") != reinterpret_cast<char*>(-1)) 79a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville return; 80a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 81a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville // llvm-rs-link needs following functions existing in libslang. 82a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville llvm::ParseBitcodeFile(NULL, llvm::getGlobalContext(), NULL); 83a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville llvm::Linker::LinkModules(NULL, NULL, 0, NULL); 84a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 85a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville // llvm-rs-cc need this. 86a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville new clang::TextDiagnosticPrinter(llvm::errs(), 87a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville clang::DiagnosticOptions()); 88a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } 89a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville} ForceSlangLinking; 90a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 91a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville} // namespace 92a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 93a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savillenamespace slang { 94a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 95a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville#if defined(__arm__) 96a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville# define DEFAULT_TARGET_TRIPLE_STRING "armv7-none-linux-gnueabi" 97a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville#elif defined(__x86_64__) 98a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville# define DEFAULT_TARGET_TRIPLE_STRING "x86_64-unknown-linux" 99a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville#else 100a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville// let's use x86 as default target 101a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville# define DEFAULT_TARGET_TRIPLE_STRING "i686-unknown-linux" 102a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville#endif 103a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 104a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savillebool Slang::GlobalInitialized = false; 105a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 106a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville// Language option (define the language feature for compiler such as C99) 107a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleclang::LangOptions Slang::LangOpts; 108a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 109a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville// Code generation option for the compiler 110a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleclang::CodeGenOptions Slang::CodeGenOpts; 111a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 112a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville// The named of metadata node that pragma resides (should be synced with 113a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville// bcc.cpp) 114a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleconst llvm::StringRef Slang::PragmaMetadataName = "#pragma"; 115a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 116a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savillestatic inline llvm::tool_output_file * 117a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink SavilleOpenOutputFile(const char *OutputFile, 118a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville unsigned Flags, 119a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville std::string* Error, 120a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville clang::DiagnosticsEngine *DiagEngine) 121a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville{ 122a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville slangAssert((OutputFile != NULL) && (Error != NULL) && 123a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville (DiagEngine != NULL) && "Invalid parameter!"); 124a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 125a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (SlangUtils::CreateDirectoryWithParents( 126a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville llvm::sys::path::parent_path(OutputFile), Error)) { 127a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville llvm::tool_output_file *F = 128a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville new llvm::tool_output_file(OutputFile, *Error, Flags); 129a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (F != NULL) 130a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville return F; 131a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville } 132a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville 133b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Report error here. 134b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby DiagEngine->Report(clang::diag::err_fe_error_opening) 135b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby << OutputFile << *Error; 136b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 137b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby return NULL; 138ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby} 139ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::GlobalInitialization() { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!GlobalInitialized) { 142767a662ecde33c3979bf02b793d392aca0403162Wink Saville // We only support x86, x64 and ARM target 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For ARM 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LLVMInitializeARMTargetInfo(); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LLVMInitializeARMTarget(); 147b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby LLVMInitializeARMAsmPrinter(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For x86 and x64 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LLVMInitializeX86TargetInfo(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LLVMInitializeX86Target(); 152b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby LLVMInitializeX86AsmPrinter(); 153ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby 154ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby // Please refer to include/clang/Basic/LangOptions.h to setup 155ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby // the options. 156ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby LangOpts.RTTI = 0; // Turn off the RTTI information support 157ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby LangOpts.NeXTRuntime = 0; // Turn off the NeXT runtime uses 158767a662ecde33c3979bf02b793d392aca0403162Wink Saville LangOpts.C99 = 1; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 160ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby CodeGenOpts.OptimizationLevel = 3; 161ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GlobalInitialized = true; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 164767a662ecde33c3979bf02b793d392aca0403162Wink Saville} 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 166767a662ecde33c3979bf02b793d392aca0403162Wink Savillevoid Slang::LLVMErrorHandler(void *UserData, const std::string &Message) { 167b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby clang::DiagnosticsEngine* DiagEngine = 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static_cast<clang::DiagnosticsEngine *>(UserData); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 170b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby DiagEngine->Report(clang::diag::err_fe_error_backend) << Message; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exit(1); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::createDiagnostic() { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagClient = new DiagnosticBuffer(); 176b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagIDs = new clang::DiagnosticIDs(); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagEngine = new clang::DiagnosticsEngine(mDiagIDs, mDiagClient, true); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiag.reset(new clang::Diagnostic(mDiagEngine.getPtr())); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initDiagnostic(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::createTarget(const std::string &Triple, const std::string &CPU, 185767a662ecde33c3979bf02b793d392aca0403162Wink Saville const std::vector<std::string> &Features) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Triple.empty()) 187b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mTargetOpts.Triple = Triple; 188b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby else 189b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mTargetOpts.Triple = DEFAULT_TARGET_TRIPLE_STRING; 190ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby 191ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby if (!CPU.empty()) 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTargetOpts.CPU = CPU; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 194767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (!Features.empty()) 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTargetOpts.Features = Features; 196767a662ecde33c3979bf02b793d392aca0403162Wink Saville 197b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mTarget.reset(clang::TargetInfo::CreateTargetInfo(*mDiagEngine, 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTargetOpts)); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 200b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::createFileManager() { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFileSysOpt.reset(new clang::FileSystemOptions()); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFileMgr.reset(new clang::FileManager(*mFileSysOpt)); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::createSourceManager() { 207b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mSourceMgr.reset(new clang::SourceManager(*mDiagEngine, *mFileMgr)); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 209b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 210767a662ecde33c3979bf02b793d392aca0403162Wink Savillevoid Slang::createPreprocessor() { 211b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Default only search header file in current dir 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clang::HeaderSearch *HeaderInfo = new clang::HeaderSearch(*mFileMgr); 213b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 214ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby mPP.reset(new clang::Preprocessor(*mDiagEngine, 215ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby LangOpts, 216ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby mTarget.get(), 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *mSourceMgr, 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *HeaderInfo, 219767a662ecde33c3979bf02b793d392aca0403162Wink Saville *this, 220b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby NULL, 221b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /* OwnsHeaderSearch = */true)); 222b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Initialize the preprocessor 223b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPragmas.clear(); 224b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPP->AddPragmaHandler(new PragmaRecorder(&mPragmas)); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 226767a662ecde33c3979bf02b793d392aca0403162Wink Saville std::vector<clang::DirectoryLookup> SearchList; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (unsigned i = 0, e = mIncludePaths.size(); i != e; i++) { 228767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (const clang::DirectoryEntry *DE = 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFileMgr->getDirectory(mIncludePaths[i])) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SearchList.push_back(clang::DirectoryLookup(DE, 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clang::SrcMgr::C_System, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, 233767a662ecde33c3979bf02b793d392aca0403162Wink Saville false)); 234b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 235b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 236ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby 237ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby HeaderInfo->SetSearchPaths(SearchList, 238ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby /* angledDirIdx = */1, 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* systemDixIdx = */1, 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* noCurDirSearch = */false); 241767a662ecde33c3979bf02b793d392aca0403162Wink Saville 242b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby initPreprocessor(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 244b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 245b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyvoid Slang::createASTContext() { 246b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mASTContext.reset(new clang::ASTContext(LangOpts, 247b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby *mSourceMgr, 248b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mTarget.get(), 249b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPP->getIdentifierTable(), 250b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPP->getSelectorTable(), 251b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPP->getBuiltinInfo(), 252b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby /* size_reserve = */0)); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initASTContext(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclang::ASTConsumer * 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectSlang::createBackend(const clang::CodeGenOptions& CodeGenOpts, 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project llvm::raw_ostream *OS, OutputType OT) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Backend(mDiagEngine.getPtr(), CodeGenOpts, mTargetOpts, 260d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby &mPragmas, OS, OT); 261d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby} 262d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby 263d8e147ce79e8424d22be501c87e43cd8f2427ddbJake HambySlang::Slang() : mInitialized(false), mDiagClient(NULL), mOT(OT_Default) { 264d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby GlobalInitialization(); 265d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby} 266d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby 267d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hambyvoid Slang::init(const std::string &Triple, const std::string &CPU, 268d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby const std::vector<std::string> &Features) { 269d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby if (mInitialized) 270d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby return; 271d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby 272d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby createDiagnostic(); 273d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby llvm::install_fatal_error_handler(LLVMErrorHandler, mDiagEngine.getPtr()); 274d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby 275d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby createTarget(Triple, CPU, Features); 276d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby createFileManager(); 277d8e147ce79e8424d22be501c87e43cd8f2427ddbJake Hamby createSourceManager(); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInitialized = true; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclang::ModuleKey Slang::loadModule(clang::SourceLocation ImportLoc, 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clang::IdentifierInfo &ModuleName, 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clang::SourceLocation ModuleNameLoc) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //FIXME: Don't we have to implement this? 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project slangAssert(0 && "Not implemented"); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 288145ff609de3206b585819ef974fab20cdc2d9f5eJake Hamby} 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 290b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambybool Slang::setInputSource(llvm::StringRef InputFile, 291b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby const char *Text, 292b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby size_t TextLength) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputFileName = InputFile.str(); 294b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Reset the ID tables if we are reusing the SourceManager 296b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mSourceMgr->clearIDTables(); 297b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Load the source 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project llvm::MemoryBuffer *SB = 300b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby llvm::MemoryBuffer::getMemBuffer(Text, Text + TextLength); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSourceMgr->createMainFileIDForMemBuffer(SB); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30364c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink if (mSourceMgr->getMainFileID().isInvalid()) { 304e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 306b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 307b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby return true; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31064c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalinkbool Slang::setInputSource(llvm::StringRef InputFile) { 31164c499113a758cf80cddfd4d0183f944a1a6645aTammo Spalink mInputFileName = InputFile.str(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSourceMgr->clearIDTables(); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const clang::FileEntry *File = mFileMgr->getFile(InputFile); 316767a662ecde33c3979bf02b793d392aca0403162Wink Saville if (File) 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSourceMgr->createMainFileID(File); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSourceMgr->getMainFileID().isInvalid()) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagEngine->Report(clang::diag::err_fe_error_reading) << InputFile; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 326145ff609de3206b585819ef974fab20cdc2d9f5eJake Hamby 327ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hambybool Slang::setOutput(const char *OutputFile) { 328ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby llvm::sys::Path OutputFilePath(OutputFile); 329ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby std::string Error; 330ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby llvm::tool_output_file *OS = NULL; 331ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby 332ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby switch (mOT) { 333ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby case OT_Dependency: 334ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby case OT_Assembly: 335ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby case OT_LLVMAssembly: { 336ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby OS = OpenOutputFile(OutputFile, 0, &Error, mDiagEngine.getPtr()); 337ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby break; 338ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby } 339ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby case OT_Nothing: { 340ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby break; 341ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby } 342ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby case OT_Object: 343ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby case OT_Bitcode: { 344ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby OS = OpenOutputFile(OutputFile, llvm::raw_fd_ostream::F_Binary, 345ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby &Error, mDiagEngine.getPtr()); 346ab79ee4adcbc6eb9fb9c509766753f65d3857739Jake Hamby break; 347b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 348b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby default: { 349b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby llvm_unreachable("Unknown compiler output type"); 350b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 353b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (!Error.empty()) 354b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby return false; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 356b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mOS.reset(OS); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOutputFileName = OutputFile; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 360767a662ecde33c3979bf02b793d392aca0403162Wink Saville return true; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool Slang::setDepOutput(const char *OutputFile) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project llvm::sys::Path OutputFilePath(OutputFile); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project std::string Error; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDOS.reset(OpenOutputFile(OutputFile, 0, &Error, mDiagEngine.getPtr())); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Error.empty() || (mDOS.get() == NULL)) 369e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink return false; 370145ff609de3206b585819ef974fab20cdc2d9f5eJake Hamby 371767a662ecde33c3979bf02b793d392aca0403162Wink Saville mDepOutputFileName = OutputFile; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 373b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby return true; 374b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby} 375b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 376b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hambyint Slang::generateDepFile() { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDiagEngine->hasErrorOccurred()) 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDOS.get() == NULL) 380e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink return 1; 381b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 382b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Initialize options for generating dependency file 383e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink clang::DependencyOutputOptions DepOpts; 384b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby DepOpts.IncludeSystemHeaders = 1; 385b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby DepOpts.OutputFile = mDepOutputFileName; 386b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby DepOpts.Targets = mAdditionalDepTargets; 387b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby DepOpts.Targets.push_back(mDepTargetBCFileName); 388b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby for (std::vector<std::string>::const_iterator 389b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end(); 390e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink I != E; 391e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink I++) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DepOpts.Targets.push_back(*I); 393e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink } 394e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink mGeneratedFileNames.clear(); 395b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 396b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Per-compilation needed initialization 397e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink createPreprocessor(); 398e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink AttachDependencyFileGen(*mPP.get(), DepOpts); 399e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Inform the diagnostic client we are processing a source file 401b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 402b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 403b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Go through the source file (no operations necessary) 404b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby clang::Token Tok; 405b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPP->EnterMainSourceFile(); 406b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby do { 407b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPP->Lex(Tok); 408b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby } while (Tok.isNot(clang::tok::eof)); 409b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 410b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mPP->EndSourceFile(); 411b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 412b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Declare success if no error 413b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (!mDiagEngine->hasErrorOccurred()) 414b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby mDOS->keep(); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clean up after compilation 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPP.reset(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDOS.reset(); 419e00dd1e5a37bed0de964b353d47a4bd7cdff532fTammo Spalink 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDiagEngine->hasErrorOccurred() ? 1 : 0; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint Slang::compile() { 424145ff609de3206b585819ef974fab20cdc2d9f5eJake Hamby if (mDiagEngine->hasErrorOccurred()) 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 426b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby if (mOS.get() == NULL) 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 1; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby // Here is per-compilation needed initialization 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createPreprocessor(); 431767a662ecde33c3979bf02b793d392aca0403162Wink Saville createASTContext(); 432767a662ecde33c3979bf02b793d392aca0403162Wink Saville 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackend.reset(createBackend(CodeGenOpts, &mOS->os(), mOT)); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Inform the diagnostic client we are processing a source file 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagClient->BeginSourceFile(LangOpts, mPP.get()); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The core of the slang compiler 439767a662ecde33c3979bf02b793d392aca0403162Wink Saville ParseAST(*mPP, mBackend.get(), *mASTContext); 440767a662ecde33c3979bf02b793d392aca0403162Wink Saville 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Inform the diagnostic client we are done with previous source file 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagClient->EndSourceFile(); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 444767a662ecde33c3979bf02b793d392aca0403162Wink Saville // Declare success if no error 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mDiagEngine->hasErrorOccurred()) 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOS->keep(); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The compilation ended, clear 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackend.reset(); 450767a662ecde33c3979bf02b793d392aca0403162Wink Saville mASTContext.reset(); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPP.reset(); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOS.reset(); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDiagEngine->hasErrorOccurred() ? 1 : 0; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 456b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::setDebugMetadataEmission(bool EmitDebug) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CodeGenOpts.DebugInfo = EmitDebug; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 460767a662ecde33c3979bf02b793d392aca0403162Wink Saville 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::setOptimizationLevel(llvm::CodeGenOpt::Level OptimizationLevel) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CodeGenOpts.OptimizationLevel = OptimizationLevel; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid Slang::reset() { 466767a662ecde33c3979bf02b793d392aca0403162Wink Saville llvm::errs() << mDiagClient->str(); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagEngine->Reset(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDiagClient->reset(); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 470b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby 471b49a73dfc4c9817bba1f227e9330555acdf9b56fJake HambySlang::~Slang() { 472b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby llvm::llvm_shutdown(); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} // namespace slang 476b49a73dfc4c9817bba1f227e9330555acdf9b56fJake Hamby