LLVM  15.0.0git
AIXException.cpp
Go to the documentation of this file.
1 //===-- CodeGen/AsmPrinter/AIXException.cpp - AIX Exception Impl ----------===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains support for writing AIX exception info into asm files.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "DwarfException.h"
17 #include "llvm/MC/MCSectionXCOFF.h"
18 #include "llvm/MC/MCStreamer.h"
21 
22 namespace llvm {
23 
25 
27 
28 void AIXException::emitExceptionInfoTable(const MCSymbol *LSDA,
29  const MCSymbol *PerSym) {
30  // Generate EH Info Table.
31  // The EH Info Table, aka, 'compat unwind section' on AIX, have the following
32  // format: struct eh_info_t {
33  // unsigned version; /* EH info verion 0 */
34  // #if defined(__64BIT__)
35  // char _pad[4]; /* padding */
36  // #endif
37  // unsigned long lsda; /* Pointer to LSDA */
38  // unsigned long personality; /* Pointer to the personality routine */
39  // }
40 
41  auto *EHInfo =
42  cast<MCSectionXCOFF>(Asm->getObjFileLowering().getCompactUnwindSection());
43  if (Asm->TM.getFunctionSections()) {
44  // If option -ffunction-sections is on, append the function name to the
45  // name of EH Info Table csect so that each function has its own EH Info
46  // Table csect. This helps the linker to garbage-collect EH info of unused
47  // functions.
48  SmallString<128> NameStr = EHInfo->getName();
49  raw_svector_ostream(NameStr) << '.' << Asm->MF->getFunction().getName();
50  EHInfo = Asm->OutContext.getXCOFFSection(NameStr, EHInfo->getKind(),
51  EHInfo->getCsectProp());
52  }
53  Asm->OutStreamer->switchSection(EHInfo);
54  MCSymbol *EHInfoLabel =
56  Asm->OutStreamer->emitLabel(EHInfoLabel);
57 
58  // Version number.
59  Asm->emitInt32(0);
60 
61  const DataLayout &DL = MMI->getModule()->getDataLayout();
62  const unsigned PointerSize = DL.getPointerSize();
63 
64  // Add necessary paddings in 64 bit mode.
65  Asm->OutStreamer->emitValueToAlignment(PointerSize);
66 
67  // LSDA location.
69  PointerSize);
70 
71  // Personality routine.
73  PointerSize);
74 }
75 
77  // There is no easy way to access register information in `AIXException`
78  // class. when ShouldEmitEHBlock is false and VRs are saved, A dumy eh info
79  // table are emitted in PPCAIXAsmPrinter::emitFunctionBodyEnd.
81  return;
82 
83  const MCSymbol *LSDALabel = emitExceptionTable();
84 
85  const Function &F = MF->getFunction();
86  assert(F.hasPersonalityFn() &&
87  "Landingpads are presented, but no personality routine is found.");
88  const auto *Per =
89  cast<GlobalValue>(F.getPersonalityFn()->stripPointerCasts());
90  const MCSymbol *PerSym = Asm->TM.getSymbol(Per);
91 
92  emitExceptionInfoTable(LSDALabel, PerSym);
93 }
94 
95 } // End of namespace llvm
AsmPrinter.h
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:17
llvm::MCSymbol
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
llvm::Function
Definition: Function.h:60
llvm::AIXException::endFunction
void endFunction(const MachineFunction *MF) override
Gather post-function debug information.
Definition: AIXException.cpp:76
llvm::TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol
static MCSymbol * getEHInfoTableSymbol(const MachineFunction *MF)
Definition: TargetLoweringObjectFileImpl.cpp:2231
llvm::EHStreamer::MMI
MachineModuleInfo * MMI
Collected machine module information.
Definition: EHStreamer.h:36
llvm::TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock
static bool ShouldEmitEHBlock(const MachineFunction *MF)
Definition: TargetLoweringObjectFileImpl.cpp:2201
F
#define F(x, y, z)
Definition: MD5.cpp:55
llvm::AIXException::AIXException
AIXException(AsmPrinter *A)
Definition: AIXException.cpp:24
TargetMachine.h
llvm::AsmPrinter::OutStreamer
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
Definition: AsmPrinter.h:97
llvm::TargetMachine::getFunctionSections
bool getFunctionSections() const
Return true if functions should be emitted into their own section, corresponding to -ffunction-sectio...
Definition: TargetMachine.h:284
llvm::EHStreamer::emitExceptionTable
MCSymbol * emitExceptionTable()
Emit landing pads and actions.
Definition: EHStreamer.cpp:375
llvm::MCObjectFileInfo::getCompactUnwindSection
MCSection * getCompactUnwindSection() const
Definition: MCObjectFileInfo.h:272
llvm::MCContext::getXCOFFSection
MCSectionXCOFF * getXCOFFSection(StringRef Section, SectionKind K, Optional< XCOFF::CsectProperties > CsectProp=None, bool MultiSymbolsAllowed=false, const char *BeginSymName=nullptr, Optional< XCOFF::DwarfSectionSubtypeFlags > DwarfSubtypeFlags=None)
Definition: MCContext.cpp:765
llvm::TargetMachine::getSymbol
MCSymbol * getSymbol(const GlobalValue *GV) const
Definition: TargetMachine.cpp:204
MCSectionXCOFF.h
llvm::SmallString< 128 >
llvm::DwarfCFIExceptionBase::endFragment
void endFragment() override
Definition: DwarfCFIException.cpp:38
llvm::DwarfCFIExceptionBase
Definition: DwarfException.h:24
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::AsmPrinter::MF
MachineFunction * MF
The current machine function.
Definition: AsmPrinter.h:100
llvm::AsmPrinter::OutContext
MCContext & OutContext
This is the context for the output file that we are streaming.
Definition: AsmPrinter.h:92
MachineModuleInfo.h
llvm::MachineFunction
Definition: MachineFunction.h:257
llvm::EHStreamer::Asm
AsmPrinter * Asm
Target of directive emission.
Definition: EHStreamer.h:33
TargetLoweringObjectFile.h
DL
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Definition: AArch64SLSHardening.cpp:76
llvm::Value::getName
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:305
llvm::MachineFunction::getFunction
Function & getFunction()
Return the LLVM function that this machine code represents.
Definition: MachineFunction.h:622
llvm::AsmPrinter
This class is intended to be used as a driving class for all asm writers.
Definition: AsmPrinter.h:82
llvm::MCSymbolRefExpr::create
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:386
llvm::AsmPrinter::emitInt32
void emitInt32(int Value) const
Emit a long directive and value.
Definition: AsmPrinter.cpp:2638
llvm::AsmPrinter::TM
TargetMachine & TM
Target machine description.
Definition: AsmPrinter.h:85
llvm::AsmPrinter::getObjFileLowering
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
Definition: AsmPrinter.cpp:382
MCStreamer.h
DwarfException.h
llvm::raw_svector_ostream
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:662
llvm::AIXException::markFunctionEnd
void markFunctionEnd() override
Definition: AIXException.cpp:26
llvm::Module::getDataLayout
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Definition: Module.cpp:398
llvm::MachineModuleInfo::getModule
const Module * getModule() const
Definition: MachineModuleInfo.h:150
llvm::ISD::MCSymbol
@ MCSymbol
Definition: ISDOpcodes.h:172
TargetLoweringObjectFileImpl.h