MCContext.cpp revision 3662e5ce709814f6b7cb3871be71ebc5e1ada16f
1ba1da8a7b10b8a7df04f3ca47ca36ad18adad80eDaniel Dunbar//===- lib/MC/MCContext.cpp - Machine Code Context ------------------------===// 2ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// 3ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// The LLVM Compiler Infrastructure 4ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// 5ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// License. See LICENSE.TXT for details. 7ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar// 8ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar//===----------------------------------------------------------------------===// 9ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar 10ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar#include "llvm/MC/MCContext.h" 111a5c28f4715d84d0302581a67e193d7a358bba17Chris Lattner#include "llvm/MC/MCAsmInfo.h" 12e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng#include "llvm/MC/MCObjectFileInfo.h" 130e6a052331f674dd70e28af41f654a7874405eabEvan Cheng#include "llvm/MC/MCRegisterInfo.h" 14f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner#include "llvm/MC/MCSectionMachO.h" 1574aae4726a66733c5872588287535a984f9a94c7Chris Lattner#include "llvm/MC/MCSectionELF.h" 16eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCSectionCOFF.h" 17ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar#include "llvm/MC/MCSymbol.h" 18ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby#include "llvm/MC/MCLabel.h" 197cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby#include "llvm/MC/MCDwarf.h" 207c5b021793e8c8184c655040ea5e169b55c55063Chris Lattner#include "llvm/ADT/SmallString.h" 217c5b021793e8c8184c655040ea5e169b55c55063Chris Lattner#include "llvm/ADT/Twine.h" 22c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola#include "llvm/Support/ELF.h" 23ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbarusing namespace llvm; 24ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar 25f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 2674aae4726a66733c5872588287535a984f9a94c7Chris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy; 27eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 28f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner 29f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner 300e6a052331f674dd70e28af41f654a7874405eabEvan ChengMCContext::MCContext(const MCAsmInfo &mai, const MCRegisterInfo &mri, 313662e5ce709814f6b7cb3871be71ebc5e1ada16fJim Grosbach const MCObjectFileInfo *mofi, const SourceMgr *mgr) : 323662e5ce709814f6b7cb3871be71ebc5e1ada16fJim Grosbach SrcMgr(mgr), MAI(mai), MRI(mri), MOFI(mofi), 33f4387d9afb9100e181b96b3bca879b940715033dEli Friedman Allocator(), Symbols(Allocator), UsedNames(Allocator), 34f4387d9afb9100e181b96b3bca879b940715033dEli Friedman NextUniqueID(0), 35c6cf43d25853efb4a6765954eda52a45998a47f2Daniel Dunbar CurrentDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0), 36c6cf43d25853efb4a6765954eda52a45998a47f2Daniel Dunbar AllowTemporaryLabels(true) { 37f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner MachOUniquingMap = 0; 3874aae4726a66733c5872588287535a984f9a94c7Chris Lattner ELFUniquingMap = 0; 39eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner COFFUniquingMap = 0; 40f187ac5a23213f85c3c1f0f80b3592295ee6441dKevin Enderby 41f187ac5a23213f85c3c1f0f80b3592295ee6441dKevin Enderby SecureLogFile = getenv("AS_SECURE_LOG_FILE"); 42f187ac5a23213f85c3c1f0f80b3592295ee6441dKevin Enderby SecureLog = 0; 43f187ac5a23213f85c3c1f0f80b3592295ee6441dKevin Enderby SecureLogUsed = false; 44c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby 45c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby DwarfLocSeen = false; 46613b7576896fbd03fe495f4ee27b404f81386774Kevin Enderby GenDwarfForAssembly = false; 47613b7576896fbd03fe495f4ee27b404f81386774Kevin Enderby GenDwarfFileNumber = 0; 48ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar} 49ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar 50ecc63f8687c4eb746b69336316685fe9b224adfbDaniel DunbarMCContext::~MCContext() { 51f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // NOTE: The symbols are all allocated out of a bump pointer allocator, 52c9d31524eec562f719d6818508b722b55a787d67Chris Lattner // we don't need to free them here. 53326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 54f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // If we have the MachO uniquing map, free it. 55f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner delete (MachOUniqueMapTy*)MachOUniquingMap; 5674aae4726a66733c5872588287535a984f9a94c7Chris Lattner delete (ELFUniqueMapTy*)ELFUniquingMap; 57eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner delete (COFFUniqueMapTy*)COFFUniquingMap; 58f187ac5a23213f85c3c1f0f80b3592295ee6441dKevin Enderby 59f187ac5a23213f85c3c1f0f80b3592295ee6441dKevin Enderby // If the stream for the .secure_log_unique directive was created free it. 60f187ac5a23213f85c3c1f0f80b3592295ee6441dKevin Enderby delete (raw_ostream*)SecureLog; 61ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar} 62ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar 63f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner//===----------------------------------------------------------------------===// 64f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner// Symbol Manipulation 65f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner//===----------------------------------------------------------------------===// 66f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner 679b97a73dedf736e14b04a3d1a153f10d25b2507bChris LattnerMCSymbol *MCContext::GetOrCreateSymbol(StringRef Name) { 6800685bb5cf791fcda9fa0ceb42a6a62a07478461Chris Lattner assert(!Name.empty() && "Normal symbols cannot be unnamed!"); 69326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 70c28cc093e3b5b8601cb5024a5365a6f31f49839aChris Lattner // Do the lookup and get the entire StringMapEntry. We want access to the 71c28cc093e3b5b8601cb5024a5365a6f31f49839aChris Lattner // key if we are creating the entry. 72c28cc093e3b5b8601cb5024a5365a6f31f49839aChris Lattner StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name); 739f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola MCSymbol *Sym = Entry.getValue(); 749f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola 759f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola if (Sym) 769f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola return Sym; 779f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola 789f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola Sym = CreateSymbol(Name); 799f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola Entry.setValue(Sym); 809f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola return Sym; 819f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola} 829f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola 839f44724be058d17944dcd9ef6a6b57734b3744b8Rafael EspindolaMCSymbol *MCContext::CreateSymbol(StringRef Name) { 84c6cf43d25853efb4a6765954eda52a45998a47f2Daniel Dunbar // Determine whether this is an assembler temporary or normal label, if used. 85c6cf43d25853efb4a6765954eda52a45998a47f2Daniel Dunbar bool isTemporary = false; 86c6cf43d25853efb4a6765954eda52a45998a47f2Daniel Dunbar if (AllowTemporaryLabels) 87c6cf43d25853efb4a6765954eda52a45998a47f2Daniel Dunbar isTemporary = Name.startswith(MAI.getPrivateGlobalPrefix()); 889f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola 899f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola StringMapEntry<bool> *NameEntry = &UsedNames.GetOrCreateValue(Name); 909f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola if (NameEntry->getValue()) { 919f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola assert(isTemporary && "Cannot rename non temporary symbols"); 92c18214a6e0a22ffa6886c70dbd6176ac9e91c847Benjamin Kramer SmallString<128> NewName = Name; 939f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola do { 94c18214a6e0a22ffa6886c70dbd6176ac9e91c847Benjamin Kramer NewName.resize(Name.size()); 95c18214a6e0a22ffa6886c70dbd6176ac9e91c847Benjamin Kramer raw_svector_ostream(NewName) << NextUniqueID++; 96c18214a6e0a22ffa6886c70dbd6176ac9e91c847Benjamin Kramer NameEntry = &UsedNames.GetOrCreateValue(NewName); 979f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola } while (NameEntry->getValue()); 989f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola } 999f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola NameEntry->setValue(true); 100c69485e34d57e17fe2c3acab64e519d6a6945197Chris Lattner 101c28cc093e3b5b8601cb5024a5365a6f31f49839aChris Lattner // Ok, the entry doesn't already exist. Have the MCSymbol object itself refer 1029f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola // to the copy of the string that is embedded in the UsedNames entry. 1039f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola MCSymbol *Result = new (*this) MCSymbol(NameEntry->getKey(), isTemporary); 1049f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola 1059f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola return Result; 106c69485e34d57e17fe2c3acab64e519d6a6945197Chris Lattner} 107c69485e34d57e17fe2c3acab64e519d6a6945197Chris Lattner 1089b97a73dedf736e14b04a3d1a153f10d25b2507bChris LattnerMCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name) { 1097c5b021793e8c8184c655040ea5e169b55c55063Chris Lattner SmallString<128> NameSV; 1107c5b021793e8c8184c655040ea5e169b55c55063Chris Lattner Name.toVector(NameSV); 1119b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner return GetOrCreateSymbol(NameSV.str()); 1127c5b021793e8c8184c655040ea5e169b55c55063Chris Lattner} 1137c5b021793e8c8184c655040ea5e169b55c55063Chris Lattner 1141d72a7661611395a1c4fd3a88a2151921180e510Chris LattnerMCSymbol *MCContext::CreateTempSymbol() { 1159f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola SmallString<128> NameSV; 116c18214a6e0a22ffa6886c70dbd6176ac9e91c847Benjamin Kramer raw_svector_ostream(NameSV) 117c18214a6e0a22ffa6886c70dbd6176ac9e91c847Benjamin Kramer << MAI.getPrivateGlobalPrefix() << "tmp" << NextUniqueID++; 1189f44724be058d17944dcd9ef6a6b57734b3744b8Rafael Espindola return CreateSymbol(NameSV); 11900685bb5cf791fcda9fa0ceb42a6a62a07478461Chris Lattner} 12000685bb5cf791fcda9fa0ceb42a6a62a07478461Chris Lattner 121ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderbyunsigned MCContext::NextInstance(int64_t LocalLabelVal) { 12247f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer MCLabel *&Label = Instances[LocalLabelVal]; 12347f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer if (!Label) 12447f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer Label = new (*this) MCLabel(0); 12547f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer return Label->incInstance(); 126ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby} 127ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby 128ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderbyunsigned MCContext::GetInstance(int64_t LocalLabelVal) { 12947f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer MCLabel *&Label = Instances[LocalLabelVal]; 13047f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer if (!Label) 13147f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer Label = new (*this) MCLabel(0); 13247f9a49560cbf629ff36f3efb591d70b29471320Benjamin Kramer return Label->getInstance(); 133ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby} 134ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby 135ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin EnderbyMCSymbol *MCContext::CreateDirectionalLocalSymbol(int64_t LocalLabelVal) { 136ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby return GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix()) + 137ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby Twine(LocalLabelVal) + 138ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby "\2" + 1393472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands Twine(NextInstance(LocalLabelVal))); 140ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby} 141ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin EnderbyMCSymbol *MCContext::GetDirectionalLocalSymbol(int64_t LocalLabelVal, 142ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby int bORf) { 143ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby return GetOrCreateSymbol(Twine(MAI.getPrivateGlobalPrefix()) + 144ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby Twine(LocalLabelVal) + 145ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby "\2" + 1463472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands Twine(GetInstance(LocalLabelVal) + bORf)); 147ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby} 148ebe7fcd041e1e9c3a0c535b26d8cdb45805bbeb8Kevin Enderby 1492928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbarMCSymbol *MCContext::LookupSymbol(StringRef Name) const { 150ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar return Symbols.lookup(Name); 151ecc63f8687c4eb746b69336316685fe9b224adfbDaniel Dunbar} 152f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner 153f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner//===----------------------------------------------------------------------===// 154f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner// Section Management 155f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner//===----------------------------------------------------------------------===// 156f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner 157f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattnerconst MCSectionMachO *MCContext:: 158f0559e4b242e85d4b9d1dd08758814c599bdce13Chris LattnergetMachOSection(StringRef Segment, StringRef Section, 159f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner unsigned TypeAndAttributes, 160f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner unsigned Reserved2, SectionKind Kind) { 161326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 162f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // We unique sections by their segment/section pair. The returned section 163f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // may not have the same flags as the requested section, if so this should be 164f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // diagnosed by the client as an error. 165326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 166f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // Create the map if it doesn't already exist. 167f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner if (MachOUniquingMap == 0) 168f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner MachOUniquingMap = new MachOUniqueMapTy(); 169f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)MachOUniquingMap; 170326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 171f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // Form the name to look up. 172f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner SmallString<64> Name; 173f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner Name += Segment; 174f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner Name.push_back(','); 175f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner Name += Section; 176326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 177f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // Do the lookup, if we have a hit, return it. 178f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner const MCSectionMachO *&Entry = Map[Name.str()]; 179f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner if (Entry) return Entry; 180326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 181f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner // Otherwise, return a new section. 18274aae4726a66733c5872588287535a984f9a94c7Chris Lattner return Entry = new (*this) MCSectionMachO(Segment, Section, TypeAndAttributes, 18374aae4726a66733c5872588287535a984f9a94c7Chris Lattner Reserved2, Kind); 184f0559e4b242e85d4b9d1dd08758814c599bdce13Chris Lattner} 18574aae4726a66733c5872588287535a984f9a94c7Chris Lattner 1864283f4b81e8c1cbf5c7a7b51e949e109ae25ff8cRafael Espindolaconst MCSectionELF *MCContext:: 18774aae4726a66733c5872588287535a984f9a94c7Chris LattnergetELFSection(StringRef Section, unsigned Type, unsigned Flags, 1882ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola SectionKind Kind) { 1892ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola return getELFSection(Section, Type, Flags, Kind, 0, ""); 1902ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola} 1912ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola 1922ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindolaconst MCSectionELF *MCContext:: 1932ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael EspindolagetELFSection(StringRef Section, unsigned Type, unsigned Flags, 1942ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola SectionKind Kind, unsigned EntrySize, StringRef Group) { 19574aae4726a66733c5872588287535a984f9a94c7Chris Lattner if (ELFUniquingMap == 0) 19674aae4726a66733c5872588287535a984f9a94c7Chris Lattner ELFUniquingMap = new ELFUniqueMapTy(); 19774aae4726a66733c5872588287535a984f9a94c7Chris Lattner ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)ELFUniquingMap; 198326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 19974aae4726a66733c5872588287535a984f9a94c7Chris Lattner // Do the lookup, if we have a hit, return it. 20074aae4726a66733c5872588287535a984f9a94c7Chris Lattner StringMapEntry<const MCSectionELF*> &Entry = Map.GetOrCreateValue(Section); 20174aae4726a66733c5872588287535a984f9a94c7Chris Lattner if (Entry.getValue()) return Entry.getValue(); 202326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 203186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung // Possibly refine the entry size first. 204186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung if (!EntrySize) { 205186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung EntrySize = MCSectionELF::DetermineEntrySize(Kind); 206186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung } 2072ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola 2082ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola MCSymbol *GroupSym = NULL; 2092ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola if (!Group.empty()) 2102ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola GroupSym = GetOrCreateSymbol(Group); 2112ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola 21274aae4726a66733c5872588287535a984f9a94c7Chris Lattner MCSectionELF *Result = new (*this) MCSectionELF(Entry.getKey(), Type, Flags, 2132ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola Kind, EntrySize, GroupSym); 21474aae4726a66733c5872588287535a984f9a94c7Chris Lattner Entry.setValue(Result); 21574aae4726a66733c5872588287535a984f9a94c7Chris Lattner return Result; 21674aae4726a66733c5872588287535a984f9a94c7Chris Lattner} 21774aae4726a66733c5872588287535a984f9a94c7Chris Lattner 2182ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindolaconst MCSectionELF *MCContext::CreateELFGroupSection() { 2192ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola MCSectionELF *Result = 220c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola new (*this) MCSectionELF(".group", ELF::SHT_GROUP, 0, 2212ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola SectionKind::getReadOnly(), 4, NULL); 2222ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola return Result; 2232ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola} 2242ff9e83a826c1c2ee0f1c6072d3d97d5b10678eeRafael Espindola 2256e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattnerconst MCSection *MCContext::getCOFFSection(StringRef Section, 2266e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner unsigned Characteristics, 2276e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner int Selection, 2286e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner SectionKind Kind) { 229eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner if (COFFUniquingMap == 0) 230eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner COFFUniquingMap = new COFFUniqueMapTy(); 231eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)COFFUniquingMap; 232326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 233eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner // Do the lookup, if we have a hit, return it. 234eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner StringMapEntry<const MCSectionCOFF*> &Entry = Map.GetOrCreateValue(Section); 235eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner if (Entry.getValue()) return Entry.getValue(); 236326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 2376e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner MCSectionCOFF *Result = new (*this) MCSectionCOFF(Entry.getKey(), 2386e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner Characteristics, 2396e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner Selection, Kind); 240326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 241eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Entry.setValue(Result); 242eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return Result; 243eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner} 2447cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby 2457cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby//===----------------------------------------------------------------------===// 2467cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby// Dwarf Management 2477cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby//===----------------------------------------------------------------------===// 2487cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby 2497cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby/// GetDwarfFile - takes a file name an number to place in the dwarf file and 2507cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby/// directory tables. If the file number has already been allocated it is an 2517cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby/// error and zero is returned and the client reports the error, else the 2527cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby/// allocated file number is returned. The file numbers may be in any order. 25344d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewyckyunsigned MCContext::GetDwarfFile(StringRef Directory, StringRef FileName, 25444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky unsigned FileNumber) { 2557cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // TODO: a FileNumber of zero says to use the next available file number. 2567cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // Note: in GenericAsmParser::ParseDirectiveFile() FileNumber was checked 2577cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // to not be less than one. This needs to be change to be not less than zero. 2587cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby 2597cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // Make space for this FileNumber in the MCDwarfFiles vector if needed. 2607cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby if (FileNumber >= MCDwarfFiles.size()) { 2617cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby MCDwarfFiles.resize(FileNumber + 1); 2627cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby } else { 2637cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby MCDwarfFile *&ExistingFile = MCDwarfFiles[FileNumber]; 2647cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby if (ExistingFile) 2657cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // It is an error to use see the same number more than once. 2667cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby return 0; 2677cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby } 2687cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby 2697cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // Get the new MCDwarfFile slot for this FileNumber. 2707cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby MCDwarfFile *&File = MCDwarfFiles[FileNumber]; 2717cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby 27244d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky if (Directory.empty()) { 27344d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky // Separate the directory part from the basename of the FileName. 27444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky std::pair<StringRef, StringRef> Slash = FileName.rsplit('/'); 27544d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky Directory = Slash.second; 276064e48a3dce1fd29a35b4b1b01a8c4b67e29c74aKevin Enderby if (!Directory.empty()) { 277064e48a3dce1fd29a35b4b1b01a8c4b67e29c74aKevin Enderby Directory = Slash.first; 278064e48a3dce1fd29a35b4b1b01a8c4b67e29c74aKevin Enderby FileName = Slash.second; 279064e48a3dce1fd29a35b4b1b01a8c4b67e29c74aKevin Enderby } 28044d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky } 2817cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby 2827cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // Find or make a entry in the MCDwarfDirs vector for this Directory. 2837cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // Capture directory name. 28444d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky unsigned DirIndex; 28544d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky if (Directory.empty()) { 28644d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky // For FileNames with no directories a DirIndex of 0 is used. 28744d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky DirIndex = 0; 2887cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby } else { 28918ad76bb9aa1970958c52887eb4a648d1bac0a0eNick Lewycky DirIndex = 0; 29018ad76bb9aa1970958c52887eb4a648d1bac0a0eNick Lewycky for (unsigned End = MCDwarfDirs.size(); DirIndex < End; DirIndex++) { 2913bce5adb32fbbe5c5549b902f4d65737f40c1499Benjamin Kramer if (Directory == MCDwarfDirs[DirIndex]) 292232ab949d5ed04c4ab45c763e0597fc3fc3fa5bcKevin Enderby break; 2937cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby } 2947cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby if (DirIndex >= MCDwarfDirs.size()) { 2953bce5adb32fbbe5c5549b902f4d65737f40c1499Benjamin Kramer char *Buf = static_cast<char *>(Allocate(Directory.size())); 2963bce5adb32fbbe5c5549b902f4d65737f40c1499Benjamin Kramer memcpy(Buf, Directory.data(), Directory.size()); 2973bce5adb32fbbe5c5549b902f4d65737f40c1499Benjamin Kramer MCDwarfDirs.push_back(StringRef(Buf, Directory.size())); 2987cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby } 299b07ce60981368f816af4caa3257e1e4ebf059133Kevin Enderby // The DirIndex is one based, as DirIndex of 0 is used for FileNames with 300b07ce60981368f816af4caa3257e1e4ebf059133Kevin Enderby // no directories. MCDwarfDirs[] is unlike MCDwarfFiles[] in that the 30144d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky // directory names are stored at MCDwarfDirs[DirIndex-1] where FileNames 30244d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky // are stored at MCDwarfFiles[FileNumber].Name . 303b07ce60981368f816af4caa3257e1e4ebf059133Kevin Enderby DirIndex++; 3047cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby } 305326990f1eb7ff005adabe46a1f982eff8835813eMichael J. Spencer 3067cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // Now make the MCDwarfFile entry and place it in the slot in the MCDwarfFiles 3077cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // vector. 30844d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky char *Buf = static_cast<char *>(Allocate(FileName.size())); 30944d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky memcpy(Buf, FileName.data(), FileName.size()); 31044d798d9763bc32aaf49fe7c10d604845f4b6685Nick Lewycky File = new (*this) MCDwarfFile(StringRef(Buf, FileName.size()), DirIndex); 3117cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby 3127cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby // return the allocated FileNumber. 3137cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby return FileNumber; 3147cbf73a73f296167b6e978dbd919ed249e88eeb5Kevin Enderby} 315c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby 3163f55c24df9527de345f6cc960944840a7a101c6aKevin Enderby/// isValidDwarfFileNumber - takes a dwarf file number and returns true if it 317c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby/// currently is assigned and false otherwise. 3183f55c24df9527de345f6cc960944840a7a101c6aKevin Enderbybool MCContext::isValidDwarfFileNumber(unsigned FileNumber) { 319c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size()) 320c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby return false; 321c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby 3223f55c24df9527de345f6cc960944840a7a101c6aKevin Enderby return MCDwarfFiles[FileNumber] != 0; 323c1840b3da25222680b51f853697a871fedda51d5Kevin Enderby} 324