DI: Rewrite the DIBuilder local variable API

Replace the general `createLocalVariable()` with two more specific
functions: `createParameterVariable()` and `createAutoVariable()`, and
rewrite the documentation.

Besides cleaning up the API, this avoids exposing the fake DWARF tags
`DW_TAG_arg_variable` and `DW_TAG_auto_variable` to frontends, and is
preparation for removing them completely.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243764 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith
2015-07-31 17:55:53 +00:00
parent 3f2cb5c959
commit aa50fa7c2f
6 changed files with 67 additions and 34 deletions

View File

@@ -457,26 +457,36 @@ namespace llvm {
unsigned LineNo, DIType *Ty, bool isLocalToUnit, llvm::Constant *Val,
MDNode *Decl = nullptr);
/// Create a new descriptor for the specified
/// local variable.
/// \param Tag Dwarf TAG. Usually DW_TAG_auto_variable or
/// DW_TAG_arg_variable.
/// \param Scope Variable scope.
/// \param Name Variable name.
/// \param File File where this variable is defined.
/// \param LineNo Line number.
/// \param Ty Variable Type
/// \param AlwaysPreserve Boolean. Set to true if debug info for this
/// variable should be preserved in optimized build.
/// \param Flags Flags, e.g. artificial variable.
/// \param ArgNo If this variable is an argument then this argument's
/// number. 1 indicates 1st argument.
DILocalVariable *createLocalVariable(unsigned Tag, DIScope *Scope,
StringRef Name, DIFile *File,
unsigned LineNo, DIType *Ty,
/// Create a new descriptor for an auto variable. This is a local variable
/// that is not a subprogram parameter.
///
/// \c Scope must be a \a DILocalScope, and thus its scope chain eventually
/// leads to a \a DISubprogram.
///
/// If \c AlwaysPreserve, this variable will be referenced from its
/// containing subprogram, and will survive some optimizations.
DILocalVariable *createAutoVariable(DIScope *Scope, StringRef Name,
DIFile *File, unsigned LineNo,
DIType *Ty,
bool AlwaysPreserve = false,
unsigned Flags = 0,
unsigned ArgNo = 0);
unsigned Flags = 0);
/// Create a new descriptor for a parameter variable.
///
/// \c Scope must be a \a DILocalScope, and thus its scope chain eventually
/// leads to a \a DISubprogram.
///
/// \c ArgNo is the index (starting from \c 1) of this variable in the
/// subprogram parameters. \c ArgNo should not conflict with other
/// parameters of the same subprogram.
///
/// If \c AlwaysPreserve, this variable will be referenced from its
/// containing subprogram, and will survive some optimizations.
DILocalVariable *createParameterVariable(DIScope *Scope, StringRef Name,
unsigned ArgNo, DIFile *File,
unsigned LineNo, DIType *Ty,
bool AlwaysPreserve = false,
unsigned Flags = 0);
/// Create a new descriptor for the specified
/// variable which has a complex address expression for its address.