MCContext.cpp revision 064e48a3dce1fd29a35b4b1b01a8c4b67e29c74a
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,
31203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng                     const MCObjectFileInfo *mofi) :
32203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng  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