diff options
Diffstat (limited to 'include/llvm/MC/MCContext.h')
| -rw-r--r-- | include/llvm/MC/MCContext.h | 82 | 
1 files changed, 59 insertions, 23 deletions
diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index d22868cdbd0c..7b26d5493776 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -29,7 +29,9 @@ namespace llvm {    class MCLineSection;    class StringRef;    class Twine; +  class TargetAsmInfo;    class MCSectionMachO; +  class MCSectionELF;    /// MCContext - Context object for machine code objects.  This class owns all    /// of the sections that it creates. @@ -41,9 +43,15 @@ namespace llvm {      /// The MCAsmInfo for this target.      const MCAsmInfo &MAI; +    const TargetAsmInfo *TAI; +      /// Symbols - Bindings of names to symbols.      StringMap<MCSymbol*> Symbols; +    /// UsedNames - Keeps tracks of names that were used both for used declared +    /// and artificial symbols. +    StringMap<bool> UsedNames; +      /// NextUniqueID - The next ID to dole out to an unnamed assembler temporary      /// symbol.      unsigned NextUniqueID; @@ -56,8 +64,8 @@ namespace llvm {      /// GetInstance() gets the current instance of the directional local label      /// for the LocalLabelVal and adds it to the map if needed.      unsigned GetInstance(int64_t LocalLabelVal); -     -    /// The file name of the log file from the enviromment variable + +    /// The file name of the log file from the environment variable      /// AS_SECURE_LOG_FILE.  Which must be set before the .secure_log_unique      /// directive is used or it is an error.      char *SecureLogFile; @@ -79,29 +87,37 @@ namespace llvm {      /// The dwarf line information from the .loc directives for the sections      /// with assembled machine instructions have after seeing .loc directives.      DenseMap<const MCSection *, MCLineSection *> MCLineSections; +    /// We need a deterministic iteration order, so we remember the order +    /// the elements were added. +    std::vector<const MCSection *> MCLineSectionOrder;      /// Allocator - Allocator object used for creating machine code objects.      ///      /// We use a bump pointer allocator to avoid the need to track all allocated      /// objects.      BumpPtrAllocator Allocator; -     +      void *MachOUniquingMap, *ELFUniquingMap, *COFFUniquingMap; + +    MCSymbol *CreateSymbol(StringRef Name); +    public: -    explicit MCContext(const MCAsmInfo &MAI); +    explicit MCContext(const MCAsmInfo &MAI, const TargetAsmInfo *TAI);      ~MCContext(); -     +      const MCAsmInfo &getAsmInfo() const { return MAI; } -    /// @name Symbol Managment +    const TargetAsmInfo &getTargetAsmInfo() const { return *TAI; } + +    /// @name Symbol Management      /// @{ -     +      /// CreateTempSymbol - Create and return a new assembler temporary symbol      /// with a unique but unspecified name.      MCSymbol *CreateTempSymbol(); -    /// CreateDirectionalLocalSymbol - Create the defintion of a directional -    /// local symbol for numbered label (used for "1:" defintions). +    /// CreateDirectionalLocalSymbol - Create the definition of a directional +    /// local symbol for numbered label (used for "1:" definitions).      MCSymbol *CreateDirectionalLocalSymbol(int64_t LocalLabelVal);      /// GetDirectionalLocalSymbol - Create and return a directional local @@ -120,8 +136,8 @@ namespace llvm {      MCSymbol *LookupSymbol(StringRef Name) const;      /// @} -     -    /// @name Section Managment + +    /// @name Section Management      /// @{      /// getMachOSection - Return the MCSection for the specified mach-o section. @@ -137,11 +153,15 @@ namespace llvm {                                            SectionKind K) {        return getMachOSection(Segment, Section, TypeAndAttributes, 0, K);      } -     -    const MCSection *getELFSection(StringRef Section, unsigned Type, -                                   unsigned Flags, SectionKind Kind, -                                   bool IsExplicit = false, -                                   unsigned EntrySize = 0); + +    const MCSectionELF *getELFSection(StringRef Section, unsigned Type, +                                      unsigned Flags, SectionKind Kind); + +    const MCSectionELF *getELFSection(StringRef Section, unsigned Type, +                                      unsigned Flags, SectionKind Kind, +                                      unsigned EntrySize, StringRef Group); + +    const MCSectionELF *CreateELFGroupSection();      const MCSection *getCOFFSection(StringRef Section, unsigned Characteristics,                                      int Selection, SectionKind Kind); @@ -151,16 +171,20 @@ namespace llvm {        return getCOFFSection (Section, Characteristics, 0, Kind);      } -     +      /// @} -    /// @name Dwarf Managment +    /// @name Dwarf Management      /// @{      /// GetDwarfFile - creates an entry in the dwarf file and directory tables.      unsigned GetDwarfFile(StringRef FileName, unsigned FileNumber); -    bool ValidateDwarfFileNumber(unsigned FileNumber); +    bool isValidDwarfFileNumber(unsigned FileNumber); + +    bool hasDwarfFiles() const { +      return !MCDwarfFiles.empty(); +    }      const std::vector<MCDwarfFile *> &getMCDwarfFiles() {        return MCDwarfFiles; @@ -168,23 +192,35 @@ namespace llvm {      const std::vector<StringRef> &getMCDwarfDirs() {        return MCDwarfDirs;      } -    DenseMap<const MCSection *, MCLineSection *> &getMCLineSections() { + +    const DenseMap<const MCSection *, MCLineSection *> +    &getMCLineSections() const {        return MCLineSections;      } +    const std::vector<const MCSection *> &getMCLineSectionOrder() const { +      return MCLineSectionOrder; +    } +    void addMCLineSection(const MCSection *Sec, MCLineSection *Line) { +      MCLineSections[Sec] = Line; +      MCLineSectionOrder.push_back(Sec); +    }      /// setCurrentDwarfLoc - saves the information from the currently parsed -    /// dwarf .loc directive and sets DwarfLocSeen.  When the next instruction      /// is assembled an entry in the line number table with this information and +    /// dwarf .loc directive and sets DwarfLocSeen.  When the next instruction +    /// is assembled an entry in the line number table with this information and      /// the address of the instruction will be created.      void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column, -                            unsigned Flags, unsigned Isa) { +                            unsigned Flags, unsigned Isa, +                            unsigned Discriminator) {        CurrentDwarfLoc.setFileNum(FileNum);        CurrentDwarfLoc.setLine(Line);        CurrentDwarfLoc.setColumn(Column);        CurrentDwarfLoc.setFlags(Flags);        CurrentDwarfLoc.setIsa(Isa); +      CurrentDwarfLoc.setDiscriminator(Discriminator);        DwarfLocSeen = true;      } -    void clearDwarfLocSeen() { DwarfLocSeen = false; } +    void ClearDwarfLocSeen() { DwarfLocSeen = false; }      bool getDwarfLocSeen() { return DwarfLocSeen; }      const MCDwarfLoc &getCurrentDwarfLoc() { return CurrentDwarfLoc; }  | 
