LLVM  17.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 
26 void AIXException::emitExceptionInfoTable(const MCSymbol *LSDA,
27  const MCSymbol *PerSym) {
28  // Generate EH Info Table.
29  // The EH Info Table, aka, 'compat unwind section' on AIX, have the following
30  // format: struct eh_info_t {
31  // unsigned version; /* EH info verion 0 */
32  // #if defined(__64BIT__)
33  // char _pad[4]; /* padding */
34  // #endif
35  // unsigned long lsda; /* Pointer to LSDA */
36  // unsigned long personality; /* Pointer to the personality routine */
37  // }
38 
39  auto *EHInfo =
40  cast<MCSectionXCOFF>(Asm->getObjFileLowering().getCompactUnwindSection());
41  if (Asm->TM.getFunctionSections()) {
42  // If option -ffunction-sections is on, append the function name to the
43  // name of EH Info Table csect so that each function has its own EH Info
44  // Table csect. This helps the linker to garbage-collect EH info of unused
45  // functions.
46  SmallString<128> NameStr = EHInfo->getName();
47  raw_svector_ostream(NameStr) << '.' << Asm->MF->getFunction().getName();
48  EHInfo = Asm->OutContext.getXCOFFSection(NameStr, EHInfo->getKind(),
49  EHInfo->getCsectProp());
50  }
51  Asm->OutStreamer->switchSection(EHInfo);
52  MCSymbol *EHInfoLabel =
54  Asm->OutStreamer->emitLabel(EHInfoLabel);
55 
56  // Version number.
57  Asm->emitInt32(0);
58 
59  const DataLayout &DL = MMI->getModule()->getDataLayout();
60  const unsigned PointerSize = DL.getPointerSize();
61 
62  // Add necessary paddings in 64 bit mode.
63  Asm->OutStreamer->emitValueToAlignment(Align(PointerSize));
64 
65  // LSDA location.
67  PointerSize);
68 
69  // Personality routine.
71  PointerSize);
72 }
73 
75  // There is no easy way to access register information in `AIXException`
76  // class. when ShouldEmitEHBlock is false and VRs are saved, A dumy eh info
77  // table are emitted in PPCAIXAsmPrinter::emitFunctionBodyEnd.
79  return;
80 
81  const MCSymbol *LSDALabel = emitExceptionTable();
82 
83  const Function &F = MF->getFunction();
84  assert(F.hasPersonalityFn() &&
85  "Landingpads are presented, but no personality routine is found.");
86  const auto *Per =
87  cast<GlobalValue>(F.getPersonalityFn()->stripPointerCasts());
88  const MCSymbol *PerSym = Asm->TM.getSymbol(Per);
89 
90  emitExceptionInfoTable(LSDALabel, PerSym);
91 }
92 
93 } // End of namespace llvm
AsmPrinter.h
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
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:59
llvm::EHStreamer
Emits exception handling directives.
Definition: EHStreamer.h:30
llvm::AIXException::endFunction
void endFunction(const MachineFunction *MF) override
Gather post-function debug information.
Definition: AIXException.cpp:74
llvm::TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol
static MCSymbol * getEHInfoTableSymbol(const MachineFunction *MF)
Definition: TargetLoweringObjectFileImpl.cpp:2271
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:2241
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:99
llvm::TargetMachine::getFunctionSections
bool getFunctionSections() const
Return true if functions should be emitted into their own section, corresponding to -ffunction-sectio...
Definition: TargetMachine.h:292
llvm::EHStreamer::emitExceptionTable
MCSymbol * emitExceptionTable()
Emit landing pads and actions.
Definition: EHStreamer.cpp:381
llvm::MCObjectFileInfo::getCompactUnwindSection
MCSection * getCompactUnwindSection() const
Definition: MCObjectFileInfo.h:268
llvm::TargetMachine::getSymbol
MCSymbol * getSymbol(const GlobalValue *GV) const
Definition: TargetMachine.cpp:204
Align
uint64_t Align
Definition: ELFObjHandler.cpp:82
MCSectionXCOFF.h
llvm::SmallString< 128 >
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::AsmPrinter::MF
MachineFunction * MF
The current machine function.
Definition: AsmPrinter.h:102
llvm::AsmPrinter::OutContext
MCContext & OutContext
This is the context for the output file that we are streaming.
Definition: AsmPrinter.h:94
MachineModuleInfo.h
llvm::MachineFunction
Definition: MachineFunction.h:258
llvm::EHStreamer::Asm
AsmPrinter * Asm
Target of directive emission.
Definition: EHStreamer.h:33
llvm::MCContext::getXCOFFSection
MCSectionXCOFF * getXCOFFSection(StringRef Section, SectionKind K, std::optional< XCOFF::CsectProperties > CsectProp=std::nullopt, bool MultiSymbolsAllowed=false, const char *BeginSymName=nullptr, std::optional< XCOFF::DwarfSectionSubtypeFlags > DwarfSubtypeFlags=std::nullopt)
Definition: MCContext.cpp:773
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:308
llvm::MachineFunction::getFunction
Function & getFunction()
Return the LLVM function that this machine code represents.
Definition: MachineFunction.h:638
llvm::AsmPrinter
This class is intended to be used as a driving class for all asm writers.
Definition: AsmPrinter.h:84
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:2787
llvm::AsmPrinter::TM
TargetMachine & TM
Target machine description.
Definition: AsmPrinter.h:87
llvm::AsmPrinter::getObjFileLowering
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
Definition: AsmPrinter.cpp:371
MCStreamer.h
DwarfException.h
llvm::raw_svector_ostream
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:672
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:146
llvm::ISD::MCSymbol
@ MCSymbol
Definition: ISDOpcodes.h:172
TargetLoweringObjectFileImpl.h