1203954Srdivacky//==-- llvm/CodeGen/TargetLoweringObjectFileImpl.h - Object Info -*- C++ -*-==// 2203954Srdivacky// 3203954Srdivacky// The LLVM Compiler Infrastructure 4203954Srdivacky// 5203954Srdivacky// This file is distributed under the University of Illinois Open Source 6203954Srdivacky// License. See LICENSE.TXT for details. 7203954Srdivacky// 8203954Srdivacky//===----------------------------------------------------------------------===// 9203954Srdivacky// 10203954Srdivacky// This file implements classes used to handle lowerings specific to common 11203954Srdivacky// object file formats. 12203954Srdivacky// 13203954Srdivacky//===----------------------------------------------------------------------===// 14203954Srdivacky 15203954Srdivacky#ifndef LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H 16203954Srdivacky#define LLVM_CODEGEN_TARGETLOWERINGOBJECTFILEIMPL_H 17203954Srdivacky 18249423Sdim#include "llvm/ADT/StringRef.h" 19203954Srdivacky#include "llvm/MC/SectionKind.h" 20203954Srdivacky#include "llvm/Target/TargetLoweringObjectFile.h" 21203954Srdivacky 22203954Srdivackynamespace llvm { 23203954Srdivacky class MachineModuleInfo; 24203954Srdivacky class Mangler; 25203954Srdivacky class MCAsmInfo; 26203954Srdivacky class MCExpr; 27203954Srdivacky class MCSection; 28203954Srdivacky class MCSectionMachO; 29203954Srdivacky class MCSymbol; 30203954Srdivacky class MCContext; 31203954Srdivacky class GlobalValue; 32203954Srdivacky class TargetMachine; 33203954Srdivacky 34203954Srdivacky 35203954Srdivackyclass TargetLoweringObjectFileELF : public TargetLoweringObjectFile { 36239462Sdim bool UseInitArray; 37239462Sdim 38203954Srdivackypublic: 39226633Sdim virtual ~TargetLoweringObjectFileELF() {} 40203954Srdivacky 41221345Sdim virtual void emitPersonalityValue(MCStreamer &Streamer, 42221345Sdim const TargetMachine &TM, 43221345Sdim const MCSymbol *Sym) const; 44221345Sdim 45203954Srdivacky /// getSectionForConstant - Given a constant with the SectionKind, return a 46203954Srdivacky /// section that it should be placed in. 47203954Srdivacky virtual const MCSection *getSectionForConstant(SectionKind Kind) const; 48203954Srdivacky 49203954Srdivacky 50203954Srdivacky virtual const MCSection * 51203954Srdivacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 52203954Srdivacky Mangler *Mang, const TargetMachine &TM) const; 53203954Srdivacky 54203954Srdivacky virtual const MCSection * 55203954Srdivacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 56203954Srdivacky Mangler *Mang, const TargetMachine &TM) const; 57203954Srdivacky 58249423Sdim /// getTTypeGlobalReference - Return an MCExpr to use for a reference to the 59249423Sdim /// specified type info global variable from exception handling information. 60203954Srdivacky virtual const MCExpr * 61249423Sdim getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 62249423Sdim MachineModuleInfo *MMI, unsigned Encoding, 63249423Sdim MCStreamer &Streamer) const; 64221345Sdim 65221345Sdim // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality. 66221345Sdim virtual MCSymbol * 67221345Sdim getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 68221345Sdim MachineModuleInfo *MMI) const; 69234353Sdim 70239462Sdim void InitializeELF(bool UseInitArray_); 71234353Sdim virtual const MCSection * 72234353Sdim getStaticCtorSection(unsigned Priority = 65535) const; 73234353Sdim virtual const MCSection * 74234353Sdim getStaticDtorSection(unsigned Priority = 65535) const; 75203954Srdivacky}; 76203954Srdivacky 77203954Srdivacky 78203954Srdivacky 79203954Srdivackyclass TargetLoweringObjectFileMachO : public TargetLoweringObjectFile { 80203954Srdivackypublic: 81226633Sdim virtual ~TargetLoweringObjectFileMachO() {} 82203954Srdivacky 83234353Sdim /// emitModuleFlags - Emit the module flags that specify the garbage 84234353Sdim /// collection information. 85234353Sdim virtual void emitModuleFlags(MCStreamer &Streamer, 86234353Sdim ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 87234353Sdim Mangler *Mang, const TargetMachine &TM) const; 88234353Sdim 89203954Srdivacky virtual const MCSection * 90203954Srdivacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 91203954Srdivacky Mangler *Mang, const TargetMachine &TM) const; 92203954Srdivacky 93203954Srdivacky virtual const MCSection * 94203954Srdivacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 95203954Srdivacky Mangler *Mang, const TargetMachine &TM) const; 96203954Srdivacky 97203954Srdivacky virtual const MCSection *getSectionForConstant(SectionKind Kind) const; 98203954Srdivacky 99203954Srdivacky /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively 100203954Srdivacky /// decide not to emit the UsedDirective for some symbols in llvm.used. 101203954Srdivacky /// FIXME: REMOVE this (rdar://7071300) 102203954Srdivacky virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, 103203954Srdivacky Mangler *) const; 104203954Srdivacky 105249423Sdim /// getTTypeGlobalReference - The mach-o version of this method 106203954Srdivacky /// defaults to returning a stub reference. 107203954Srdivacky virtual const MCExpr * 108249423Sdim getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 109249423Sdim MachineModuleInfo *MMI, unsigned Encoding, 110249423Sdim MCStreamer &Streamer) const; 111204642Srdivacky 112221345Sdim // getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality. 113221345Sdim virtual MCSymbol * 114221345Sdim getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 115221345Sdim MachineModuleInfo *MMI) const; 116203954Srdivacky}; 117203954Srdivacky 118203954Srdivacky 119203954Srdivacky 120203954Srdivackyclass TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile { 121203954Srdivackypublic: 122226633Sdim virtual ~TargetLoweringObjectFileCOFF() {} 123203954Srdivacky 124203954Srdivacky virtual const MCSection * 125203954Srdivacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 126203954Srdivacky Mangler *Mang, const TargetMachine &TM) const; 127203954Srdivacky 128203954Srdivacky virtual const MCSection * 129203954Srdivacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 130203954Srdivacky Mangler *Mang, const TargetMachine &TM) const; 131251662Sdim 132251662Sdim /// emitModuleFlags - Emit Obj-C garbage collection and linker options. Only 133251662Sdim /// linker option emission is implemented for COFF. 134251662Sdim virtual void emitModuleFlags(MCStreamer &Streamer, 135251662Sdim ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 136251662Sdim Mangler *Mang, const TargetMachine &TM) const; 137203954Srdivacky}; 138203954Srdivacky 139203954Srdivacky} // end namespace llvm 140203954Srdivacky 141203954Srdivacky#endif 142