//===- lib/MC/MCWinEH.cpp - Windows EH implementation ---------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/ADT/StringRef.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCObjectFileInfo.h" #include "llvm/MC/MCSectionCOFF.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCWinEH.h" #include "llvm/Support/COFF.h" namespace llvm { namespace WinEH { const MCSection *UnwindEmitter::GetPDataSection(StringRef Suffix, MCContext &Context) { if (Suffix.empty()) return Context.getObjectFileInfo()->getPDataSection(); return Context.getCOFFSection((".pdata" + Suffix).str(), COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ, SectionKind::getDataRel()); } const MCSection *UnwindEmitter::GetXDataSection(StringRef Suffix, MCContext &Context) { if (Suffix.empty()) return Context.getObjectFileInfo()->getXDataSection(); return Context.getCOFFSection((".xdata" + Suffix).str(), COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ, SectionKind::getDataRel()); } StringRef UnwindEmitter::GetSectionSuffix(const MCSymbol *Function) { if (!Function || !Function->isInSection()) return ""; const MCSection *FunctionSection = &Function->getSection(); if (const auto Section = dyn_cast(FunctionSection)) { StringRef Name = Section->getSectionName(); size_t Dollar = Name.find('$'); size_t Dot = Name.find('.', 1); if (Dollar == StringRef::npos && Dot == StringRef::npos) return ""; if (Dot == StringRef::npos) return Name.substr(Dollar); if (Dollar == StringRef::npos || Dot < Dollar) return Name.substr(Dot); return Name.substr(Dollar); } return ""; } } }