brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · f17dfe9 Raw
63 lines · c
1//===------- SEHFrameSupport.h - JITLink seh-frame utils --------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// SEHFrame utils for JITLink.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H14#define LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H15 16#include "llvm/ADT/SetVector.h"17#include "llvm/ExecutionEngine/JITLink/JITLink.h"18#include "llvm/ExecutionEngine/JITSymbol.h"19#include "llvm/Support/Error.h"20#include "llvm/TargetParser/Triple.h"21 22namespace llvm {23namespace jitlink {24/// This pass adds keep-alive edge from SEH frame sections25/// to the parent function content block.26class SEHFrameKeepAlivePass {27public:28  SEHFrameKeepAlivePass(StringRef SEHFrameSectionName)29      : SEHFrameSectionName(SEHFrameSectionName) {}30 31  Error operator()(LinkGraph &G) {32    auto *S = G.findSectionByName(SEHFrameSectionName);33    if (!S)34      return Error::success();35 36    // Simply consider every block pointed by seh frame block as parants.37    // This adds some unnecessary keep-alive edges to unwind info blocks,38    // (xdata) but these blocks are usually dead by default, so they wouldn't39    // count for the fate of seh frame block.40    for (auto *B : S->blocks()) {41      auto &DummySymbol = G.addAnonymousSymbol(*B, 0, 0, false, false);42      SetVector<Block *> Children;43      for (auto &E : B->edges()) {44        auto &Sym = E.getTarget();45        if (!Sym.isDefined())46          continue;47        Children.insert(&Sym.getBlock());48      }49      for (auto *Child : Children)50        Child->addEdge(Edge(Edge::KeepAlive, 0, DummySymbol, 0));51    }52    return Error::success();53  }54 55private:56  StringRef SEHFrameSectionName;57};58 59} // end namespace jitlink60} // end namespace llvm61 62#endif // LLVM_EXECUTIONENGINE_JITLINK_SEHFRAMESUPPORT_H63