mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 03:29:40 +00:00
Add a line number for the scope of the function (starting at the first
brace) so that we get more accurate line number information about the declaration of a given function and the line where the function first starts. Part of rdar://11026482 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153916 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2e267ae7b8
commit
6126a1e189
@ -452,6 +452,7 @@ global variables are collected inside the named metadata
|
||||
metadata, ;; Reference to type descriptor
|
||||
i1, ;; True if the global is local to compile unit (static)
|
||||
i1, ;; True if the global is defined in the compile unit (not extern)
|
||||
i32, ;; Line number where the scope of the subprogram begins
|
||||
i32, ;; Virtuality, e.g. dwarf::DW_VIRTUALITY__virtual
|
||||
i32, ;; Index into a virtual function
|
||||
metadata, ;; indicates which base type contains the vtable pointer for the
|
||||
|
@ -445,6 +445,7 @@ namespace llvm {
|
||||
/// @param Ty Function type.
|
||||
/// @param isLocalToUnit True if this function is not externally visible..
|
||||
/// @param isDefinition True if this is a function definition.
|
||||
/// @param ScopeLine Set to the beginning of the scope this starts
|
||||
/// @param Flags e.g. is this function prototyped or not.
|
||||
/// This flags are used to emit dwarf attributes.
|
||||
/// @param isOptimized True if optimization is ON.
|
||||
@ -455,6 +456,7 @@ namespace llvm {
|
||||
DIFile File, unsigned LineNo,
|
||||
DIType Ty, bool isLocalToUnit,
|
||||
bool isDefinition,
|
||||
unsigned ScopeLine,
|
||||
unsigned Flags = 0,
|
||||
bool isOptimized = false,
|
||||
Function *Fn = 0,
|
||||
|
@ -519,6 +519,7 @@ namespace llvm {
|
||||
DICompositeType getContainingType() const {
|
||||
return getFieldAs<DICompositeType>(13);
|
||||
}
|
||||
|
||||
unsigned isArtificial() const {
|
||||
if (getVersion() <= llvm::LLVMDebugVersion8)
|
||||
return getUnsignedField(14);
|
||||
@ -567,6 +568,11 @@ namespace llvm {
|
||||
return getFieldAs<DIFile>(6).getDirectory();
|
||||
}
|
||||
|
||||
/// getScopeLineNumber - Get the beginning of the scope of the
|
||||
/// function, not necessarily where the name of the program
|
||||
/// starts.
|
||||
unsigned getScopeLineNumber() const { return getUnsignedField(20); }
|
||||
|
||||
/// Verify - Verify that a subprogram descriptor is well formed.
|
||||
bool Verify() const;
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "llvm/IntrinsicInst.h"
|
||||
#include "llvm/Module.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
|
||||
using namespace llvm;
|
||||
@ -825,6 +826,7 @@ DISubprogram DIBuilder::createFunction(DIDescriptor Context,
|
||||
DIFile File, unsigned LineNo,
|
||||
DIType Ty,
|
||||
bool isLocalToUnit, bool isDefinition,
|
||||
unsigned ScopeLine,
|
||||
unsigned Flags, bool isOptimized,
|
||||
Function *Fn,
|
||||
MDNode *TParams,
|
||||
@ -854,7 +856,8 @@ DISubprogram DIBuilder::createFunction(DIDescriptor Context,
|
||||
Fn,
|
||||
TParams,
|
||||
Decl,
|
||||
THolder
|
||||
THolder,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), ScopeLine)
|
||||
};
|
||||
MDNode *Node = MDNode::get(VMContext, Elts);
|
||||
|
||||
@ -902,7 +905,9 @@ DISubprogram DIBuilder::createMethod(DIDescriptor Context,
|
||||
Fn,
|
||||
TParam,
|
||||
llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
|
||||
THolder
|
||||
THolder,
|
||||
// FIXME: Do we want to use a different scope lines?
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
|
||||
};
|
||||
MDNode *Node = MDNode::get(VMContext, Elts);
|
||||
return DISubprogram(Node);
|
||||
|
@ -787,6 +787,9 @@ void DISubprogram::print(raw_ostream &OS) const {
|
||||
if (isDefinition())
|
||||
OS << " [def] ";
|
||||
|
||||
if (getScopeLineNumber() != getLineNumber())
|
||||
OS << " [Scope: " << getScopeLineNumber() << "] ";
|
||||
|
||||
OS << "\n";
|
||||
}
|
||||
|
||||
|
@ -1193,12 +1193,19 @@ static MDNode *getScopeNode(DebugLoc DL, const LLVMContext &Ctx) {
|
||||
}
|
||||
|
||||
/// getFnDebugLoc - Walk up the scope chain of given debug loc and find
|
||||
/// line number info for the function.
|
||||
/// line number info for the function.
|
||||
static DebugLoc getFnDebugLoc(DebugLoc DL, const LLVMContext &Ctx) {
|
||||
const MDNode *Scope = getScopeNode(DL, Ctx);
|
||||
DISubprogram SP = getDISubprogram(Scope);
|
||||
if (SP.Verify())
|
||||
return DebugLoc::get(SP.getLineNumber(), 0, SP);
|
||||
if (SP.Verify()) {
|
||||
// Check for number of operands since the compatibility is
|
||||
// cheap here.
|
||||
if (Scope->getNumOperands() > 19)
|
||||
return DebugLoc::get(SP.getScopeLineNumber(), 0, SP);
|
||||
else
|
||||
return DebugLoc::get(SP.getLineNumber(), 0, SP);
|
||||
}
|
||||
|
||||
return DebugLoc();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user