blob: 6c74dcd9ecfdf75ff083ab581dd6d41dc25d40c0 [file] [log] [blame]
Daniel Dunbarba1da8a2009-06-23 23:39:15 +00001//===- lib/MC/MCContext.cpp - Machine Code Context ------------------------===//
Daniel Dunbarecc63f82009-06-23 22:01:43 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/MC/MCContext.h"
11
Daniel Dunbarecc63f82009-06-23 22:01:43 +000012#include "llvm/MC/MCSection.h"
13#include "llvm/MC/MCSymbol.h"
Daniel Dunbarba1da8a2009-06-23 23:39:15 +000014#include "llvm/MC/MCValue.h"
Daniel Dunbarecc63f82009-06-23 22:01:43 +000015using namespace llvm;
16
17MCContext::MCContext()
18{
19}
20
21MCContext::~MCContext() {
22}
23
Daniel Dunbarb5261eb2009-07-27 21:22:30 +000024MCSection *MCContext::GetSection(const StringRef &Name) {
Daniel Dunbarecc63f82009-06-23 22:01:43 +000025 MCSection *&Entry = Sections[Name];
26
27 if (!Entry)
Daniel Dunbara11af532009-06-24 01:03:06 +000028 Entry = new (*this) MCSection(Name);
Daniel Dunbarecc63f82009-06-23 22:01:43 +000029
30 return Entry;
31}
Daniel Dunbarecc63f82009-06-23 22:01:43 +000032
Daniel Dunbarb5261eb2009-07-27 21:22:30 +000033MCSymbol *MCContext::CreateSymbol(const StringRef &Name) {
Daniel Dunbarecc63f82009-06-23 22:01:43 +000034 assert(Name[0] != '\0' && "Normal symbols cannot be unnamed!");
35
36 // Create and bind the symbol, and ensure that names are unique.
37 MCSymbol *&Entry = Symbols[Name];
38 assert(!Entry && "Duplicate symbol definition!");
Daniel Dunbar71d259b2009-06-24 17:00:42 +000039 return Entry = new (*this) MCSymbol(Name, false);
Daniel Dunbarecc63f82009-06-23 22:01:43 +000040}
41
Daniel Dunbarb5261eb2009-07-27 21:22:30 +000042MCSymbol *MCContext::GetOrCreateSymbol(const StringRef &Name) {
Chris Lattnerc69485e2009-06-24 04:31:49 +000043 MCSymbol *&Entry = Symbols[Name];
44 if (Entry) return Entry;
45
Daniel Dunbar71d259b2009-06-24 17:00:42 +000046 return Entry = new (*this) MCSymbol(Name, false);
Chris Lattnerc69485e2009-06-24 04:31:49 +000047}
48
49
Daniel Dunbarb5261eb2009-07-27 21:22:30 +000050MCSymbol *MCContext::CreateTemporarySymbol(const StringRef &Name) {
Daniel Dunbarecc63f82009-06-23 22:01:43 +000051 // If unnamed, just create a symbol.
Daniel Dunbarb5261eb2009-07-27 21:22:30 +000052 if (Name.empty())
Daniel Dunbar71d259b2009-06-24 17:00:42 +000053 new (*this) MCSymbol("", true);
Daniel Dunbarecc63f82009-06-23 22:01:43 +000054
55 // Otherwise create as usual.
56 MCSymbol *&Entry = Symbols[Name];
57 assert(!Entry && "Duplicate symbol definition!");
Daniel Dunbar71d259b2009-06-24 17:00:42 +000058 return Entry = new (*this) MCSymbol(Name, true);
Daniel Dunbarecc63f82009-06-23 22:01:43 +000059}
60
Daniel Dunbarb5261eb2009-07-27 21:22:30 +000061MCSymbol *MCContext::LookupSymbol(const StringRef &Name) const {
Daniel Dunbarecc63f82009-06-23 22:01:43 +000062 return Symbols.lookup(Name);
63}
64
65void MCContext::ClearSymbolValue(MCSymbol *Sym) {
66 SymbolValues.erase(Sym);
67}
68
Daniel Dunbarba1da8a2009-06-23 23:39:15 +000069void MCContext::SetSymbolValue(MCSymbol *Sym, const MCValue &Value) {
Daniel Dunbarecc63f82009-06-23 22:01:43 +000070 SymbolValues[Sym] = Value;
71}
72
Daniel Dunbarba1da8a2009-06-23 23:39:15 +000073const MCValue *MCContext::GetSymbolValue(MCSymbol *Sym) const {
74 DenseMap<MCSymbol*, MCValue>::iterator it = SymbolValues.find(Sym);
Daniel Dunbarecc63f82009-06-23 22:01:43 +000075
76 if (it == SymbolValues.end())
77 return 0;
78
79 return &it->second;
80}