1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/*
2932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Copyright 2011, The Android Open Source Project
3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * you may not use this file except in compliance with the License.
6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * You may obtain a copy of the License at
7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Unless required by applicable law or agreed to in writing, software
11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * See the License for the specific language governing permissions and
14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * limitations under the License.
15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */
16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#ifndef __ANDROID_BCINFO_BITCODETRANSLATOR_H__
18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define __ANDROID_BCINFO_BITCODETRANSLATOR_H__
19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstddef>
21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
22932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo {
23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
24932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesclass BitcodeTranslator {
25932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines private:
26932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  const char *mBitcode;
27932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  size_t mBitcodeSize;
28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  const char *mTranslatedBitcode;
29932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  size_t mTranslatedBitcodeSize;
30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  unsigned int mVersion;
31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines public:
33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * Translates \p bitcode of a particular \p version to the latest version.
35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   *
36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \param bitcode - input bitcode string.
37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \param bitcodeSize - length of \p bitcode string (in bytes).
38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \param version - corresponding target SDK version of \p bitcode.
39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  BitcodeTranslator(const char *bitcode, size_t bitcodeSize,
41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                    unsigned int version);
42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  ~BitcodeTranslator();
44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * Translate the supplied bitcode to the latest supported version.
47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   *
48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return true if the bitcode was translated successfully and false if an
49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   *         error occurred.
50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  bool translate();
52932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
53932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
54932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return translated bitcode.
55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  const char *getTranslatedBitcode() const {
57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mTranslatedBitcode;
58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
59932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
60932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  /**
61932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   * \return size of the translated bitcode (in bytes).
62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines   */
63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  size_t getTranslatedBitcodeSize() const {
64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return mTranslatedBitcodeSize;
65932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines};
67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}  // namespace bcinfo
69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#endif  // __ANDROID_BCINFO_BITCODETRANSLATOR_H__
71