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