transformer.cpp revision 3f30b6202dd5ad6ff66959131d216405850ed152
14df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni/*
24df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Copyright 2017, The Android Open Source Project
34df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
44df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
54df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * you may not use this file except in compliance with the License.
64df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * You may obtain a copy of the License at
74df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
84df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *     http://www.apache.org/licenses/LICENSE-2.0
94df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
104df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Unless required by applicable law or agreed to in writing, software
114df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
124df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * See the License for the specific language governing permissions and
144df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * limitations under the License.
154df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni */
164df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
174df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "transformer.h"
184df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
194df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "module.h"
204df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
214df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace android {
224df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace spirit {
234df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
243f30b6202dd5ad6ff66959131d216405850ed152Yang NiModule *Transformer::run(Module *module, int *error) {
253f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  auto words = runAndSerialize(module, error);
263f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  std::unique_ptr<InputWordStream> IS(InputWordStream::Create(words));
274df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  return Deserialize<Module>(*IS);
284df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni}
294df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
303f30b6202dd5ad6ff66959131d216405850ed152Yang Nistd::vector<uint32_t> Transformer::runAndSerialize(Module *m, int *error) {
313f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  mModule = m;
323f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
333f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  // Since contents in the decoration or global section may change, transform
343f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  // and serialize the function definitions first.
353f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  mVisit = 0;
363f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  mShouldRecord = false;
373f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  mStream = mStreamFunctions.get();
383f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  m->accept(this);
393f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
403f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  // Record in the annotation section any new annotations added
413f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  m->consolidateAnnotations();
423f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
433f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  // After the functions are transformed, serialize the other sections to
443f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  // capture any changes made during the function transformation, and append
453f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  // the new words from function serialization.
463f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
473f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  mVisit = 1;
483f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  mShouldRecord = true;
493f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  mStream = mStreamFinal.get();
503f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
513f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  // TODO fix Module::accept() to have the header serialization code there
524df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  m->SerializeHeader(*mStream);
534df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  m->accept(this);
543f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
553f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  auto output = mStream->getWords();
563f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  auto functions = mStreamFunctions->getWords();
573f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  output.insert(output.end(), functions.begin(), functions.end());
583f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
593f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  if (error) {
603f30b6202dd5ad6ff66959131d216405850ed152Yang Ni    *error = 0;
613f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  }
623f30b6202dd5ad6ff66959131d216405850ed152Yang Ni
633f30b6202dd5ad6ff66959131d216405850ed152Yang Ni  return output;
644df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni}
654df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
664df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nivoid Transformer::insert(Instruction *inst) {
674df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  // TODO: warn on nullptr inst
684df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  inst->Serialize(*mStream);
694df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni}
704df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
714df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace spirit
724df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace android
73