[llvm-commits] [llvm] r111956 - in /llvm/trunk: include/llvm/MC/MCContext.h include/llvm/MC/MCDwarf.h lib/MC/MCContext.cpp lib/MC/MCParser/AsmParser.cpp

Daniel Dunbar daniel at zuster.org
Sat Oct 2 09:41:10 PDT 2010


Hi Kevin,

On Tue, Aug 24, 2010 at 1:32 PM, Kevin Enderby <enderby at apple.com> wrote:
> Author: enderby
> Date: Tue Aug 24 15:32:42 2010
> New Revision: 111956
>
> URL: http://llvm.org/viewvc/llvm-project?rev=111956&view=rev
> Log:
> First bit of support for the dwarf .loc directive.  This patch updates the
> needed parsing for the .loc directive and saves the current info from that
> into the context.  The next patch will take the current loc info after an
> instruction is assembled and save that info into a vector for each section for
> use to build the line number tables.  The patch after that will encode the info
> from those vectors into the output file as the dwarf line tables.
>
> Modified:
>    llvm/trunk/include/llvm/MC/MCContext.h
>    llvm/trunk/include/llvm/MC/MCDwarf.h
>    llvm/trunk/lib/MC/MCContext.cpp
>    llvm/trunk/lib/MC/MCParser/AsmParser.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCContext.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCContext.h?rev=111956&r1=111955&r2=111956&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCContext.h (original)
> +++ llvm/trunk/include/llvm/MC/MCContext.h Tue Aug 24 15:32:42 2010
> @@ -11,6 +11,7 @@
>  #define LLVM_MC_MCCONTEXT_H
>
>  #include "llvm/MC/SectionKind.h"
> +#include "llvm/MC/MCDwarf.h"
>  #include "llvm/ADT/DenseMap.h"
>  #include "llvm/ADT/StringMap.h"
>  #include "llvm/Support/Allocator.h"
> @@ -24,6 +25,7 @@
>   class MCSymbol;
>   class MCLabel;
>   class MCDwarfFile;
> +  class MCDwarfLoc;
>   class StringRef;
>   class Twine;
>   class MCSectionMachO;
> @@ -69,6 +71,10 @@
>     std::vector<MCDwarfFile *> MCDwarfFiles;
>     std::vector<StringRef> MCDwarfDirs;
>
> +    /// The current dwarf line information from the last dwarf .loc directive.
> +    MCDwarfLoc CurrentDwarfLoc;
> +    bool DwarfLocSeen;
> +
>     /// Allocator - Allocator object used for creating machine code objects.
>     ///
>     /// We use a bump pointer allocator to avoid the need to track all allocated
> @@ -149,6 +155,8 @@
>     /// GetDwarfFile - creates an entry in the dwarf file and directory tables.
>     unsigned GetDwarfFile(StringRef FileName, unsigned FileNumber);
>
> +    bool ValidateDwarfFileNumber(unsigned FileNumber);
> +
>     const std::vector<MCDwarfFile *> &getMCDwarfFiles() {
>       return MCDwarfFiles;
>     }
> @@ -156,6 +164,19 @@
>       return MCDwarfDirs;
>     }
>
> +    /// 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
> +    /// the address of the instruction will be created.

I think there is a missing newline in this comment.

> +    void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column,
> +                            unsigned Flags, unsigned Isa) {
> +      CurrentDwarfLoc.setFileNum(FileNum);
> +      CurrentDwarfLoc.setLine(Line);
> +      CurrentDwarfLoc.setColumn(Column);
> +      CurrentDwarfLoc.setFlags(Flags);
> +      CurrentDwarfLoc.setIsa(Isa);
> +      DwarfLocSeen = true;
> +    }
> +
>     /// @}
>
>     char *getSecureLogFile() { return SecureLogFile; }
>
> Modified: llvm/trunk/include/llvm/MC/MCDwarf.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCDwarf.h?rev=111956&r1=111955&r2=111956&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCDwarf.h (original)
> +++ llvm/trunk/include/llvm/MC/MCDwarf.h Tue Aug 24 15:32:42 2010
> @@ -57,6 +57,50 @@
>     void dump() const;
>   };
>
> +  /// MCDwarfLoc - Instances of this class represent the information from a
> +  /// dwarf .loc directive.
> +  class MCDwarfLoc {
> +    // FileNum - the file number.
> +    unsigned FileNum;
> +    // Line - the line number.
> +    unsigned Line;
> +    // Column - the column position.
> +    unsigned Column;
> +    // Flags (see #define's below)
> +    unsigned Flags;
> +    // Isa
> +    unsigned Isa;
> +
> +#define DWARF2_FLAG_IS_STMT        (1 << 0)
> +#define DWARF2_FLAG_BASIC_BLOCK    (1 << 1)
> +#define DWARF2_FLAG_PROLOGUE_END   (1 << 2)
> +#define DWARF2_FLAG_EPILOGUE_BEGIN (1 << 3)
> +
> +  private:  // MCContext manages these
> +    friend class MCContext;
> +    MCDwarfLoc(unsigned fileNum, unsigned line, unsigned column, unsigned flags,
> +               unsigned isa)
> +      : FileNum(fileNum), Line(line), Column(column), Flags(flags), Isa(isa) {}
> +
> +    MCDwarfLoc(const MCDwarfLoc&);       // DO NOT IMPLEMENT
> +    void operator=(const MCDwarfLoc&); // DO NOT IMPLEMENT
> +  public:
> +    /// setFileNum - Set the FileNum of this MCDwarfLoc.
> +    void setFileNum(unsigned fileNum) { FileNum = fileNum; }
> +
> +    /// setLine - Set the Line of this MCDwarfLoc.
> +    void setLine(unsigned line) { Line = line; }
> +
> +    /// setColumn - Set the Column of this MCDwarfLoc.
> +    void setColumn(unsigned column) { Column = column; }
> +
> +    /// setFlags - Set the Flags of this MCDwarfLoc.
> +    void setFlags(unsigned flags) { Flags = flags; }
> +
> +    /// setIsa - Set the Isa of this MCDwarfLoc.
> +    void setIsa(unsigned isa) { Isa = isa; }
> +  };
> +
>   inline raw_ostream &operator<<(raw_ostream &OS, const MCDwarfFile &DwarfFile){
>     DwarfFile.print(OS);
>     return OS;
>
> Modified: llvm/trunk/lib/MC/MCContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCContext.cpp?rev=111956&r1=111955&r2=111956&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCContext.cpp (original)
> +++ llvm/trunk/lib/MC/MCContext.cpp Tue Aug 24 15:32:42 2010
> @@ -24,7 +24,8 @@
>  typedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
>
>
> -MCContext::MCContext(const MCAsmInfo &mai) : MAI(mai), NextUniqueID(0) {
> +MCContext::MCContext(const MCAsmInfo &mai) : MAI(mai), NextUniqueID(0),
> +                     CurrentDwarfLoc(0,0,0,0,0) {
>   MachOUniquingMap = 0;
>   ELFUniquingMap = 0;
>   COFFUniquingMap = 0;
> @@ -32,6 +33,8 @@
>   SecureLogFile = getenv("AS_SECURE_LOG_FILE");
>   SecureLog = 0;
>   SecureLogUsed = false;
> +
> +  DwarfLocSeen = false;
>  }
>
>  MCContext::~MCContext() {
> @@ -247,3 +250,16 @@
>   // return the allocated FileNumber.
>   return FileNumber;
>  }
> +
> +/// ValidateDwarfFileNumber - takes a dwarf file number and returns true if it
> +/// currently is assigned and false otherwise.
> +bool MCContext::ValidateDwarfFileNumber(unsigned FileNumber) {
> +  if(FileNumber == 0 || FileNumber >= MCDwarfFiles.size())
> +    return false;
> +
> +  MCDwarfFile *&ExistingFile = MCDwarfFiles[FileNumber];
> +  if (ExistingFile)
> +    return true;
> +  else
> +    return false;
> +}

This could just be:
--
  return MCDwarfFiles[FileName] != 0;
--
?

Also, in terms of naming I think it would make more sense to call this
function "isValidDwarfFileNumber", since it is just a predicate and
isn't actually changing any state.

 - Daniel

> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=111956&r1=111955&r2=111956&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Tue Aug 24 15:32:42 2010
> @@ -1838,39 +1838,101 @@
>
>
>  /// ParseDirectiveLoc
> -/// ::= .loc number [number [number]]
> +/// ::= .loc FileNumber LineNumber [ColumnPos] [basic_block] [prologue_end]
> +///                                [epilogue_begin] [is_stmt VALUE] [isa VALUE]
> +/// The first number is a file number, must have been previously assigned with
> +/// a .file directive, the second number is the line number and optionally the
> +/// third number is a column position (zero if not specified).  The remaining
> +/// optional items are .loc sub-directives.
>  bool GenericAsmParser::ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc) {
> +
>   if (getLexer().isNot(AsmToken::Integer))
>     return TokError("unexpected token in '.loc' directive");
> -
> -  // FIXME: What are these fields?
>   int64_t FileNumber = getTok().getIntVal();
> -  (void) FileNumber;
> -  // FIXME: Validate file.
> +  if (FileNumber < 1)
> +    return TokError("file number less than one in '.loc' directive");
> +  if (!getContext().ValidateDwarfFileNumber(FileNumber))
> +    return TokError("unassigned file number in '.loc' directive");
> +  Lex();
>
> +  if (getLexer().isNot(AsmToken::Integer))
> +    return TokError("unexpected token in '.loc' directive");
> +  int64_t LineNumber = getTok().getIntVal();
> +  if (LineNumber < 1)
> +    return TokError("line number less than one in '.loc' directive");
>   Lex();
> -  if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -    if (getLexer().isNot(AsmToken::Integer))
> -      return TokError("unexpected token in '.loc' directive");
>
> -    int64_t Param2 = getTok().getIntVal();
> -    (void) Param2;
> +  int64_t ColumnPos = 0;
> +  if (getLexer().is(AsmToken::Integer)) {
> +    ColumnPos = getTok().getIntVal();
> +    if (ColumnPos < 0)
> +      return TokError("column position less than zero in '.loc' directive");
>     Lex();
> +  }
>
> -    if (getLexer().isNot(AsmToken::EndOfStatement)) {
> -      if (getLexer().isNot(AsmToken::Integer))
> +  unsigned Flags = 0;
> +  unsigned Isa = 0;
> +  if (getLexer().isNot(AsmToken::EndOfStatement)) {
> +    for (;;) {
> +      if (getLexer().is(AsmToken::EndOfStatement))
> +        break;
> +
> +      StringRef Name;
> +      SMLoc Loc = getTok().getLoc();
> +      if (getParser().ParseIdentifier(Name))
>         return TokError("unexpected token in '.loc' directive");
>
> -      int64_t Param3 = getTok().getIntVal();
> -      (void) Param3;
> -      Lex();
> +      if (Name == "basic_block")
> +        Flags |= DWARF2_FLAG_BASIC_BLOCK;
> +      else if (Name == "prologue_end")
> +        Flags |= DWARF2_FLAG_PROLOGUE_END;
> +      else if (Name == "epilogue_begin")
> +        Flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
> +      else if (Name == "is_stmt") {
> +        SMLoc Loc = getTok().getLoc();
> +        const MCExpr *Value;
> +        if (getParser().ParseExpression(Value))
> +          return true;
> +        // The expression must be the constant 0 or 1.
> +        if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
> +          int Value = MCE->getValue();
> +          if (Value == 0)
> +            Flags &= ~DWARF2_FLAG_IS_STMT;
> +          else if (Value == 1)
> +            Flags |= DWARF2_FLAG_IS_STMT;
> +          else
> +            return Error(Loc, "is_stmt value not 0 or 1");
> +       }
> +        else {
> +          return Error(Loc, "is_stmt value not the constant value of 0 or 1");
> +        }
> +      }
> +      else if (Name == "isa") {
> +        SMLoc Loc = getTok().getLoc();
> +        const MCExpr *Value;
> +        if (getParser().ParseExpression(Value))
> +          return true;
> +        // The expression must be a constant greater or equal to 0.
> +        if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Value)) {
> +          int Value = MCE->getValue();
> +          if (Value < 0)
> +            return Error(Loc, "isa number less than zero");
> +          Isa = Value;
> +       }
> +        else {
> +          return Error(Loc, "isa number not a constant value");
> +        }
> +      }
> +      else {
> +        return Error(Loc, "unknown sub-directive in '.loc' directive");
> +      }
>
> -      // FIXME: Do something with the .loc.
> +      if (getLexer().is(AsmToken::EndOfStatement))
> +        break;
>     }
>   }
>
> -  if (getLexer().isNot(AsmToken::EndOfStatement))
> -    return TokError("unexpected token in '.file' directive");
> +  getContext().setCurrentDwarfLoc(FileNumber, LineNumber, ColumnPos, Flags,Isa);
>
>   return false;
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list