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