/* * Copyright 2019 WebAssembly Community Group participants * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef wasm_ir_debuginfo_h #define wasm_ir_debuginfo_h #include "wasm.h" namespace wasm::debuginfo { // Given an original expression and another that replaces it, copy the debuginfo // from the former to the latter. Note the expression may not be an exclusive // replacement of the other (the other may be replaced by several expressions, // all of whom may end up with the same debug info). inline void copyOriginalToReplacement(Expression* original, Expression* replacement, Function* func) { auto& debugLocations = func->debugLocations; // Early exit if there is no debug info at all. Also, leave if we already // have debug info on the new replacement, which we don't want to trample: // if there is no debug info we do want to copy, as a replacement operation // suggests the new code plays the same role (it is an optimized version of // the old), but if the code is already annotated, trust that. if (debugLocations.empty() || debugLocations.count(replacement)) { return; } auto iter = debugLocations.find(original); if (iter != debugLocations.end()) { debugLocations[replacement] = iter->second; // Note that we do *not* erase the debug info of the expression being // replaced, because it may still exist: we might replace // // (call // (block .. // // with // // (block // (call .. // // We still want the call here to have its old debug info. // // (In most cases, of course, we do remove the replaced expression, // which means we accumulate unused garbage in debugLocations, but // that's not that bad; we use arena allocation for Expressions, after // all.) } } // Given an expression and a copy of it in another function, copy the debug // info into the second function. void copyBetweenFunctions(Expression* origin, Expression* copy, Function* originFunc, Function* copyFunc); } // namespace wasm::debuginfo #endif // wasm_ir_debuginfo_h