1*4ba319b5SDimitry Andric //===-- CodeGen/AsmPrinter/WinCFGuard.cpp - Control Flow Guard Impl ------===// 2*4ba319b5SDimitry Andric // 3*4ba319b5SDimitry Andric // The LLVM Compiler Infrastructure 4*4ba319b5SDimitry Andric // 5*4ba319b5SDimitry Andric // This file is distributed under the University of Illinois Open Source 6*4ba319b5SDimitry Andric // License. See LICENSE.TXT for details. 7*4ba319b5SDimitry Andric // 8*4ba319b5SDimitry Andric //===----------------------------------------------------------------------===// 9*4ba319b5SDimitry Andric // 10*4ba319b5SDimitry Andric // This file contains support for writing Win64 exception info into asm files. 11*4ba319b5SDimitry Andric // 12*4ba319b5SDimitry Andric //===----------------------------------------------------------------------===// 13*4ba319b5SDimitry Andric 14*4ba319b5SDimitry Andric #include "WinCFGuard.h" 15*4ba319b5SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h" 16*4ba319b5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 17*4ba319b5SDimitry Andric #include "llvm/CodeGen/MachineModuleInfo.h" 18*4ba319b5SDimitry Andric #include "llvm/CodeGen/MachineOperand.h" 19*4ba319b5SDimitry Andric #include "llvm/IR/Constants.h" 20*4ba319b5SDimitry Andric #include "llvm/IR/Metadata.h" 21*4ba319b5SDimitry Andric #include "llvm/MC/MCAsmInfo.h" 22*4ba319b5SDimitry Andric #include "llvm/MC/MCObjectFileInfo.h" 23*4ba319b5SDimitry Andric #include "llvm/MC/MCStreamer.h" 24*4ba319b5SDimitry Andric 25*4ba319b5SDimitry Andric #include <vector> 26*4ba319b5SDimitry Andric 27*4ba319b5SDimitry Andric using namespace llvm; 28*4ba319b5SDimitry Andric WinCFGuard(AsmPrinter * A)29*4ba319b5SDimitry AndricWinCFGuard::WinCFGuard(AsmPrinter *A) : AsmPrinterHandler(), Asm(A) {} 30*4ba319b5SDimitry Andric ~WinCFGuard()31*4ba319b5SDimitry AndricWinCFGuard::~WinCFGuard() {} 32*4ba319b5SDimitry Andric endModule()33*4ba319b5SDimitry Andricvoid WinCFGuard::endModule() { 34*4ba319b5SDimitry Andric const Module *M = Asm->MMI->getModule(); 35*4ba319b5SDimitry Andric std::vector<const Function *> Functions; 36*4ba319b5SDimitry Andric for (const Function &F : *M) 37*4ba319b5SDimitry Andric if (F.hasAddressTaken()) 38*4ba319b5SDimitry Andric Functions.push_back(&F); 39*4ba319b5SDimitry Andric if (Functions.empty()) 40*4ba319b5SDimitry Andric return; 41*4ba319b5SDimitry Andric auto &OS = *Asm->OutStreamer; 42*4ba319b5SDimitry Andric OS.SwitchSection(Asm->OutContext.getObjectFileInfo()->getGFIDsSection()); 43*4ba319b5SDimitry Andric for (const Function *F : Functions) 44*4ba319b5SDimitry Andric OS.EmitCOFFSymbolIndex(Asm->getSymbol(F)); 45*4ba319b5SDimitry Andric } 46