X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FELF.h;h=cb5a8c0eae1d3a42c119fbc62afd28de64e78659;hb=31acb89c6545847435518f42825102aa30af9fd4;hp=cd0c68a7a2e4ca5cbc6976a53e64982e9af3e7e8;hpb=746e3bb3547d848af86c4d677dfdc2c4481c7518;p=oota-llvm.git diff --git a/lib/CodeGen/ELF.h b/lib/CodeGen/ELF.h index cd0c68a7a2e..cb5a8c0eae1 100644 --- a/lib/CodeGen/ELF.h +++ b/lib/CodeGen/ELF.h @@ -22,7 +22,7 @@ #include "llvm/CodeGen/BinaryObject.h" #include "llvm/CodeGen/MachineRelocation.h" -#include "llvm/Support/DataTypes.h" +#include "llvm/System/DataTypes.h" namespace llvm { class GlobalValue; @@ -59,10 +59,10 @@ namespace llvm { // ELF symbols are related to llvm ones by being one of the two llvm // types, for the other ones (section, file, func) a null pointer is - // assumed. + // assumed by default. union { const GlobalValue *GV; // If this is a pointer to a GV - const char *Ext; // If this is a pointer to a named symbol + const char *Ext; // If this is a pointer to a named symbol } Source; // Describes from which source type this ELF symbol comes from, @@ -74,22 +74,22 @@ namespace llvm { }; unsigned SourceType; - bool isGlobalValue() { return SourceType == isGV; } - bool isExternalSym() { return SourceType == isExtSym; } + bool isGlobalValue() const { return SourceType == isGV; } + bool isExternalSym() const { return SourceType == isExtSym; } // getGlobalValue - If this is a global value which originated the // elf symbol, return a reference to it. - const GlobalValue *getGlobalValue() { + const GlobalValue *getGlobalValue() const { assert(SourceType == isGV && "This is not a global value"); return Source.GV; - }; + } // getExternalSym - If this is an external symbol which originated the // elf symbol, return a reference to it. - const char *getExternalSymbol() { + const char *getExternalSymbol() const { assert(SourceType == isExtSym && "This is not an external symbol"); return Source.Ext; - }; + } // getGV - From a global value return a elf symbol to represent it static ELFSym *getGV(const GlobalValue *GV, unsigned Bind, @@ -118,13 +118,36 @@ namespace llvm { // getSectionSym - Returns a elf symbol to represent an elf section static ELFSym *getSectionSym() { ELFSym *Sym = new ELFSym(); - Sym->setBind(ELFSym::STB_LOCAL); - Sym->setType(ELFSym::STT_SECTION); - Sym->setVisibility(ELFSym::STV_DEFAULT); + Sym->setBind(STB_LOCAL); + Sym->setType(STT_SECTION); + Sym->setVisibility(STV_DEFAULT); + Sym->SourceType = isOther; + return Sym; + } + + // getFileSym - Returns a elf symbol to represent the module identifier + static ELFSym *getFileSym() { + ELFSym *Sym = new ELFSym(); + Sym->setBind(STB_LOCAL); + Sym->setType(STT_FILE); + Sym->setVisibility(STV_DEFAULT); + Sym->SectionIdx = 0xfff1; // ELFSection::SHN_ABS; Sym->SourceType = isOther; return Sym; } + // getUndefGV - Returns a STT_NOTYPE symbol + static ELFSym *getUndefGV(const GlobalValue *GV, unsigned Bind) { + ELFSym *Sym = new ELFSym(); + Sym->Source.GV = GV; + Sym->setBind(Bind); + Sym->setType(STT_NOTYPE); + Sym->setVisibility(STV_DEFAULT); + Sym->SectionIdx = 0; //ELFSection::SHN_UNDEF; + Sym->SourceType = isGV; + return Sym; + } + // ELF specific fields unsigned NameIdx; // Index in .strtab of name, once emitted. uint64_t Value; @@ -164,6 +187,7 @@ namespace llvm { unsigned getBind() const { return (Info >> 4) & 0xf; } unsigned getType() const { return Info & 0xf; } bool isLocalBind() const { return getBind() == STB_LOCAL; } + bool isFileType() const { return getType() == STT_FILE; } void setBind(unsigned X) { assert(X == (X & 0xF) && "Bind value out of range!");