152aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao/*
252aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * Copyright 2012, The Android Open Source Project
352aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao *
452aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
552aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * you may not use this file except in compliance with the License.
652aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * You may obtain a copy of the License at
752aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao *
852aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao *     http://www.apache.org/licenses/LICENSE-2.0
952aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao *
1052aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * Unless required by applicable law or agreed to in writing, software
1152aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
1252aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * See the License for the specific language governing permissions and
1452aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao * limitations under the License.
1552aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao */
1652aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
1752aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao#ifndef BCC_ABC_COMPILER_DRIVER_H
1852aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao#define BCC_ABC_COMPILER_DRIVER_H
1952aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
203f64f76a827af742d969fe0b699d42a70b069998Shih-wei Liao#include "bcc/AndroidBitcode/ABCCompiler.h"
2152aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao#include "bcc/BCCContext.h"
2252aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao#include "bcc/Compiler.h"
2352aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao#include "bcc/Linker.h"
2452aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
2552aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao#include <string>
2652aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
2752aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaonamespace bcc {
2852aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
2942b88c3b3cdadf6fcd367ee2bc620c0c94bbfe1bShih-wei Liaoclass ABCExpandVAArgPass;
3052aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaoclass CompilerConfig;
3152aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaoclass LinkerConfig;
3252aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
3352aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaoclass ABCCompilerDriver {
3452aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaoprivate:
3552aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  BCCContext mContext;
363f64f76a827af742d969fe0b699d42a70b069998Shih-wei Liao  ABCCompiler mCompiler;
3752aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  Linker mLinker;
3852aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
3952aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  CompilerConfig *mCompilerConfig;
4052aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  LinkerConfig *mLinkerConfig;
4152aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
4252aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  std::string mAndroidSysroot;
4352aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
4452aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaoprivate:
4552aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  bool configCompiler();
4652aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  bool configLinker();
4752aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
4852aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaoprivate:
4952aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  Script *prepareScript(int pInputFd);
5052aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  bool compile(Script &pScript, llvm::raw_ostream &pOutput);
5152aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  bool link(const Script &pScript, const std::string &input_relocatable,
5252aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao            int pOutputFd);
5352aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
5465569163ae870b16f3a1bedaa994e62422c3963eShih-wei Liaoprivate:
5565569163ae870b16f3a1bedaa994e62422c3963eShih-wei Liao  virtual CompilerConfig *createCompilerConfig() const = 0;
5665569163ae870b16f3a1bedaa994e62422c3963eShih-wei Liao  virtual LinkerConfig *createLinkerConfig() const = 0;
5765569163ae870b16f3a1bedaa994e62422c3963eShih-wei Liao
583928c62048612cd7180136017be5b7436c55717cShih-wei Liaoprotected:
5931b7c5664f33fcc335c29d8533537ad3c50fe467Shih-wei Liao  virtual const char **getNonPortableList() const {
6031b7c5664f33fcc335c29d8533537ad3c50fe467Shih-wei Liao    return NULL;
6131b7c5664f33fcc335c29d8533537ad3c50fe467Shih-wei Liao  }
6231b7c5664f33fcc335c29d8533537ad3c50fe467Shih-wei Liao
6342b88c3b3cdadf6fcd367ee2bc620c0c94bbfe1bShih-wei Liaopublic:
6442b88c3b3cdadf6fcd367ee2bc620c0c94bbfe1bShih-wei Liao  virtual ABCExpandVAArgPass *createExpandVAArgPass() const = 0;
6542b88c3b3cdadf6fcd367ee2bc620c0c94bbfe1bShih-wei Liao
6631b7c5664f33fcc335c29d8533537ad3c50fe467Shih-wei Liaoprotected:
6765569163ae870b16f3a1bedaa994e62422c3963eShih-wei Liao  ABCCompilerDriver();
683928c62048612cd7180136017be5b7436c55717cShih-wei Liao
6952aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liaopublic:
703928c62048612cd7180136017be5b7436c55717cShih-wei Liao  static ABCCompilerDriver *Create(const std::string &pTriple);
713928c62048612cd7180136017be5b7436c55717cShih-wei Liao
723928c62048612cd7180136017be5b7436c55717cShih-wei Liao  virtual ~ABCCompilerDriver();
733928c62048612cd7180136017be5b7436c55717cShih-wei Liao
743928c62048612cd7180136017be5b7436c55717cShih-wei Liao  inline const std::string &getAndroidSysroot() const {
753928c62048612cd7180136017be5b7436c55717cShih-wei Liao    return mAndroidSysroot;
763928c62048612cd7180136017be5b7436c55717cShih-wei Liao  }
773f64f76a827af742d969fe0b699d42a70b069998Shih-wei Liao
783928c62048612cd7180136017be5b7436c55717cShih-wei Liao  inline void setAndroidSysroot(const std::string &pAndroidSysroot) {
793928c62048612cd7180136017be5b7436c55717cShih-wei Liao    mAndroidSysroot = pAndroidSysroot;
803928c62048612cd7180136017be5b7436c55717cShih-wei Liao  }
8152aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
8252aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  // Compile the bitcode and link the shared object
8352aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao  bool build(int pInputFd, int pOutputFd);
8452aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao};
8552aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
8652aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao} // end namespace bcc
8752aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao
8852aefd86e18310cd7e5de81f8498bb3497978519Shih-wei Liao#endif // BCC_ABC_COMPILER_DRIVER_H
89