1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/*
27cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Copyright 2011-2012, 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#include "bcinfo/BitcodeTranslator.h"
18932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
197cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include "bcinfo/BitcodeWrapper.h"
207cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
21932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "BitReader_2_7/BitReader_2_7.h"
22c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien#include "BitReader_3_0/BitReader_3_0.h"
23932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
248dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines#include "BitWriter_3_2/ReaderWriter_3_2.h"
258dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines
26bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross#include "StripUnkAttr/strip_unknown_attributes.h"
27bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross
28932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#define LOG_TAG "bcinfo"
29d5c690148285e5c3a396ff0a48a3c20bdd833dd5Mark Salyzyn#include <log/log.h>
30932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/BitstreamWriter.h"
32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Bitcode/ReaderWriter.h"
33b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/LLVMContext.h"
34b730e239619a546d93e5926ea92d698ab77ec7f6Stephen Hines#include "llvm/IR/Module.h"
35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include "llvm/Support/MemoryBuffer.h"
36c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao#include "llvm/Support/raw_ostream.h"
37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <cstdlib>
39881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes#include <climits>
40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesnamespace bcinfo {
42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/**
44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Define minimum and maximum target API versions. These correspond to the
45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * same API levels used by the standard Android SDK.
46932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines *
47c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * LLVM 2.7
48c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *  11 - Honeycomb
49c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *  12 - Honeycomb MR1
50c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *  13 - Honeycomb MR2
51c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *
52c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * LLVM 3.0
53c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *  14 - Ice Cream Sandwich
54c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *  15 - Ice Cream Sandwich MR1
55c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *
56c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien * LLVM 3.1
57c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien *  16 - Ice Cream Sandwich MR2
58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */
59881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kMinimumAPIVersion     = 11;
60881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kMaximumAPIVersion     = RS_VERSION;
61881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kCurrentAPIVersion     = 10000;
62881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailesstatic const unsigned int kDevelopmentAPIVersion = UINT_MAX;
63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/**
65932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * The minimum version which does not require translation (i.e. is already
66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * compatible with LLVM's default bitcode reader).
67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */
68c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienstatic const unsigned int kMinimumUntranslatedVersion = 16;
69c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienstatic const unsigned int kMinimumCompatibleVersion_LLVM_3_0 = 14;
70c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chienstatic const unsigned int kMinimumCompatibleVersion_LLVM_2_7 = 11;
71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
73bcb03e5437a811eeaf1dfa895bfe93d841e76660David Grossstatic void stripUnknownAttributes(llvm::Module *M) {
74bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross  for (llvm::Function &F : *M)
75bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross    slang::stripUnknownAttributes(F);
76bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross}
77bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross
78932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesBitcodeTranslator::BitcodeTranslator(const char *bitcode, size_t bitcodeSize,
79932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines                                     unsigned int version)
80900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes    : mBitcode(bitcode), mBitcodeSize(bitcodeSize), mTranslatedBitcode(nullptr),
81932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines      mTranslatedBitcodeSize(0), mVersion(version) {
82932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return;
83932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
84932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
85932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
86932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesBitcodeTranslator::~BitcodeTranslator() {
87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  if (mVersion < kMinimumUntranslatedVersion) {
88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    // We didn't actually do a translation in the alternate case, so deleting
89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    // the bitcode would be improper.
90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    delete [] mTranslatedBitcode;
91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
92900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes  mTranslatedBitcode = nullptr;
93932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return;
94932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
95932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
96932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
97932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesbool BitcodeTranslator::translate() {
98932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  if (!mBitcode || !mBitcodeSize) {
9910c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block    ALOGE("Invalid/empty bitcode");
100932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return false;
101932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
102932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
1037cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  BitcodeWrapper BCWrapper(mBitcode, mBitcodeSize);
1047cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  if (BCWrapper.getTargetAPI() != mVersion) {
1057cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    ALOGE("Bitcode wrapper (%u) and translator (%u) disagree about target API",
1067cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines          BCWrapper.getTargetAPI(), mVersion);
1077cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
1087cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
109881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes  if ((mVersion != kDevelopmentAPIVersion) &&
110881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes      (mVersion != kCurrentAPIVersion)     &&
111881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes       ((mVersion < kMinimumAPIVersion) ||
112881cda4f5b793a1e7f7d33cf4a31efc3fdbba4fdChris Wailes        (mVersion > kMaximumAPIVersion))) {
11310c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block    ALOGE("Invalid API version: %u is out of range ('%u' - '%u')", mVersion,
114932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines         kMinimumAPIVersion, kMaximumAPIVersion);
115932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return false;
116932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
117932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
118932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  // We currently don't need to transcode any API version higher than 14 or
119932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  // the current API version (i.e. 10000)
120932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  if (mVersion >= kMinimumUntranslatedVersion) {
121932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    mTranslatedBitcode = mBitcode;
122932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    mTranslatedBitcodeSize = mBitcodeSize;
123932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return true;
124932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
125932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
126932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  // Do the actual transcoding by invoking a 2.7-era bitcode reader that can
127932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  // then write the bitcode back out in a more modern (acceptable) version.
128d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines  std::unique_ptr<llvm::LLVMContext> mContext(new llvm::LLVMContext());
129d0993af5b1337f8186dd9aedea2e138a919e02e9Stephen Hines  std::unique_ptr<llvm::MemoryBuffer> MEM(
130932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    llvm::MemoryBuffer::getMemBuffer(
131e708ffe612f4566bea20334d2c9dac34db508e6eStephen Hines      llvm::StringRef(mBitcode, mBitcodeSize), "", false));
132932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  std::string error;
133579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines  llvm::ErrorOr<llvm::MemoryBufferRef> MBOrErr = MEM->getMemBufferRef();
134932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
135579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines  llvm::ErrorOr<llvm::Module *> MOrErr(nullptr);
136c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien
137c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien  if (mVersion >= kMinimumCompatibleVersion_LLVM_3_0) {
138579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines    MOrErr = llvm_3_0::parseBitcodeFile(*MBOrErr, *mContext);
139c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien  } else if (mVersion >= kMinimumCompatibleVersion_LLVM_2_7) {
140579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines    MOrErr = llvm_2_7::parseBitcodeFile(*MBOrErr, *mContext);
141c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien  } else {
14210c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block    ALOGE("No compatible bitcode reader for API version %d", mVersion);
143c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien    return false;
144c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien  }
145c7d67a701663191bcdab2416c11b69fae16d49fbLogan Chien
146579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines  if (std::error_code EC = MOrErr.getError()) {
14710c1412e6cb35cfc90abb5e36ba1340a8c55f44eSteve Block    ALOGE("Could not parse bitcode file");
148579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines    ALOGE("%s", EC.message().c_str());
149932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines    return false;
150932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  }
151932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
152579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines  // Module ownership is handled by the context, so we don't need to free it.
153579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines  llvm::Module *module = MOrErr.get();
154579361346abc6696c805e3904a18178ebce4e4a3Stephen Hines
155bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross  stripUnknownAttributes(module);
156bcb03e5437a811eeaf1dfa895bfe93d841e76660David Gross
157c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao  std::string Buffer;
158c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao
159c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao  llvm::raw_string_ostream OS(Buffer);
1608dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines  // Use the LLVM 3.2 bitcode writer, instead of the top-of-tree version.
1618dbca8e957dab1db77dffbe10c14c54d4b439be6Stephen Hines  llvm_3_2::WriteBitcodeToFile(module, OS);
162c73b5214fa71ef6e3378fa121bb8b6312d2e6d3bShih-wei Liao  OS.flush();
163932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
1647cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  AndroidBitcodeWrapper wrapper;
1657cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  size_t actualWrapperLen = writeAndroidBitcodeWrapper(
166dc31b1cf67e4997f511eb22d6589a45e3e57209dStephen Hines      &wrapper, Buffer.size(), kMinimumUntranslatedVersion,
1677cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines      BCWrapper.getCompilerVersion(), BCWrapper.getOptimizationLevel());
1687cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  if (!actualWrapperLen) {
1697cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    ALOGE("Couldn't produce bitcode wrapper!");
1707cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    return false;
1717cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
1727cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
1737cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  mTranslatedBitcodeSize = actualWrapperLen + Buffer.size();
1747cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  char *c = new char[mTranslatedBitcodeSize];
1757cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  memcpy(c, &wrapper, actualWrapperLen);
176e9c850f5d85f3aa31b6e841478ea52e82d76c261Stephen Hines  memcpy(c + actualWrapperLen, Buffer.c_str(), Buffer.size());
177932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
178932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  mTranslatedBitcode = c;
179932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
180932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines  return true;
181932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}
182932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines
183932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines}  // namespace bcinfo
184