12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- //===------- SEHFrameSupport.h - JITLink seh-frame utils --------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // SEHFrame utils for JITLink.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
- #define LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
- #include "llvm/ADT/Triple.h"
- #include "llvm/ExecutionEngine/JITLink/JITLink.h"
- #include "llvm/ExecutionEngine/JITSymbol.h"
- #include "llvm/Support/Error.h"
- namespace llvm {
- namespace jitlink {
- /// This pass adds keep-alive edge from SEH frame sections
- /// to the parent function content block.
- class SEHFrameKeepAlivePass {
- public:
- SEHFrameKeepAlivePass(StringRef SEHFrameSectionName)
- : SEHFrameSectionName(SEHFrameSectionName) {}
- Error operator()(LinkGraph &G) {
- auto *S = G.findSectionByName(SEHFrameSectionName);
- if (!S)
- return Error::success();
- // Simply consider every block pointed by seh frame block as parants.
- // This adds some unnecessary keep-alive edges to unwind info blocks,
- // (xdata) but these blocks are usually dead by default, so they wouldn't
- // count for the fate of seh frame block.
- for (auto *B : S->blocks()) {
- auto &DummySymbol = G.addAnonymousSymbol(*B, 0, 0, false, false);
- DenseSet<Block *> Children;
- for (auto &E : B->edges()) {
- auto &Sym = E.getTarget();
- if (!Sym.isDefined())
- continue;
- Children.insert(&Sym.getBlock());
- }
- for (auto *Child : Children)
- Child->addEdge(Edge(Edge::KeepAlive, 0, DummySymbol, 0));
- }
- return Error::success();
- }
- private:
- StringRef SEHFrameSectionName;
- };
- } // end namespace jitlink
- } // end namespace llvm
- #endif // LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H
|