mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-30 05:29:47 +00:00
This changes Win64EHEmitter into a utility WinEH UnwindEmitter that can be shared across multiple architectures and a target specific bit which is overridden (Win64::UnwindEmitter). This enables sharing the section selection code across X86 and the intended use in ARM for emitting unwind information for Windows on ARM. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215050 91177308-0d34-0410-b5e6-96231b3b80d8
65 lines
2.2 KiB
C++
65 lines
2.2 KiB
C++
//===- 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<MCSectionCOFF>(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 "";
|
|
}
|
|
}
|
|
}
|
|
|