1*e8d8bef9SDimitry Andric //===-- CodeGen/AsmPrinter/AIXException.cpp - AIX Exception Impl ----------===// 2*e8d8bef9SDimitry Andric // 3*e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e8d8bef9SDimitry Andric // 7*e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8*e8d8bef9SDimitry Andric // 9*e8d8bef9SDimitry Andric // This file contains support for writing AIX exception info into asm files. 10*e8d8bef9SDimitry Andric // 11*e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 12*e8d8bef9SDimitry Andric 13*e8d8bef9SDimitry Andric #include "DwarfException.h" 14*e8d8bef9SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h" 15*e8d8bef9SDimitry Andric #include "llvm/CodeGen/MachineModuleInfo.h" 16*e8d8bef9SDimitry Andric #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 17*e8d8bef9SDimitry Andric #include "llvm/MC/MCSectionXCOFF.h" 18*e8d8bef9SDimitry Andric #include "llvm/MC/MCStreamer.h" 19*e8d8bef9SDimitry Andric #include "llvm/Target/TargetLoweringObjectFile.h" 20*e8d8bef9SDimitry Andric #include "llvm/Target/TargetMachine.h" 21*e8d8bef9SDimitry Andric 22*e8d8bef9SDimitry Andric namespace llvm { 23*e8d8bef9SDimitry Andric 24*e8d8bef9SDimitry Andric AIXException::AIXException(AsmPrinter *A) : DwarfCFIExceptionBase(A) {} 25*e8d8bef9SDimitry Andric 26*e8d8bef9SDimitry Andric void AIXException::emitExceptionInfoTable(const MCSymbol *LSDA, 27*e8d8bef9SDimitry Andric const MCSymbol *PerSym) { 28*e8d8bef9SDimitry Andric // Generate EH Info Table. 29*e8d8bef9SDimitry Andric // The EH Info Table, aka, 'compat unwind section' on AIX, have the following 30*e8d8bef9SDimitry Andric // format: struct eh_info_t { 31*e8d8bef9SDimitry Andric // unsigned version; /* EH info verion 0 */ 32*e8d8bef9SDimitry Andric // #if defined(__64BIT__) 33*e8d8bef9SDimitry Andric // char _pad[4]; /* padding */ 34*e8d8bef9SDimitry Andric // #endif 35*e8d8bef9SDimitry Andric // unsigned long lsda; /* Pointer to LSDA */ 36*e8d8bef9SDimitry Andric // unsigned long personality; /* Pointer to the personality routine */ 37*e8d8bef9SDimitry Andric // } 38*e8d8bef9SDimitry Andric 39*e8d8bef9SDimitry Andric Asm->OutStreamer->SwitchSection( 40*e8d8bef9SDimitry Andric Asm->getObjFileLowering().getCompactUnwindSection()); 41*e8d8bef9SDimitry Andric MCSymbol *EHInfoLabel = 42*e8d8bef9SDimitry Andric TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(Asm->MF); 43*e8d8bef9SDimitry Andric Asm->OutStreamer->emitLabel(EHInfoLabel); 44*e8d8bef9SDimitry Andric 45*e8d8bef9SDimitry Andric // Version number. 46*e8d8bef9SDimitry Andric Asm->emitInt32(0); 47*e8d8bef9SDimitry Andric 48*e8d8bef9SDimitry Andric const DataLayout &DL = MMI->getModule()->getDataLayout(); 49*e8d8bef9SDimitry Andric const unsigned PointerSize = DL.getPointerSize(); 50*e8d8bef9SDimitry Andric 51*e8d8bef9SDimitry Andric // Add necessary paddings in 64 bit mode. 52*e8d8bef9SDimitry Andric Asm->OutStreamer->emitValueToAlignment(PointerSize); 53*e8d8bef9SDimitry Andric 54*e8d8bef9SDimitry Andric // LSDA location. 55*e8d8bef9SDimitry Andric Asm->OutStreamer->emitValue(MCSymbolRefExpr::create(LSDA, Asm->OutContext), 56*e8d8bef9SDimitry Andric PointerSize); 57*e8d8bef9SDimitry Andric 58*e8d8bef9SDimitry Andric // Personality routine. 59*e8d8bef9SDimitry Andric Asm->OutStreamer->emitValue(MCSymbolRefExpr::create(PerSym, Asm->OutContext), 60*e8d8bef9SDimitry Andric PointerSize); 61*e8d8bef9SDimitry Andric } 62*e8d8bef9SDimitry Andric 63*e8d8bef9SDimitry Andric void AIXException::endFunction(const MachineFunction *MF) { 64*e8d8bef9SDimitry Andric if (!TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock(MF)) 65*e8d8bef9SDimitry Andric return; 66*e8d8bef9SDimitry Andric 67*e8d8bef9SDimitry Andric const MCSymbol *LSDALabel = emitExceptionTable(); 68*e8d8bef9SDimitry Andric 69*e8d8bef9SDimitry Andric const Function &F = MF->getFunction(); 70*e8d8bef9SDimitry Andric assert(F.hasPersonalityFn() && 71*e8d8bef9SDimitry Andric "Landingpads are presented, but no personality routine is found."); 72*e8d8bef9SDimitry Andric const Function *Per = 73*e8d8bef9SDimitry Andric dyn_cast<Function>(F.getPersonalityFn()->stripPointerCasts()); 74*e8d8bef9SDimitry Andric const MCSymbol *PerSym = Asm->TM.getSymbol(Per); 75*e8d8bef9SDimitry Andric 76*e8d8bef9SDimitry Andric emitExceptionInfoTable(LSDALabel, PerSym); 77*e8d8bef9SDimitry Andric } 78*e8d8bef9SDimitry Andric 79*e8d8bef9SDimitry Andric } // End of namespace llvm 80