forked from OSchip/llvm-project
Emit debug info for static const class member.
llvm-svn: 110885
This commit is contained in:
parent
a3025fcd45
commit
caa23f0708
|
@ -553,7 +553,6 @@ CollectRecordFields(const RecordDecl *RD, llvm::DIFile Unit,
|
||||||
I != E; ++I, ++FieldNo) {
|
I != E; ++I, ++FieldNo) {
|
||||||
FieldDecl *Field = *I;
|
FieldDecl *Field = *I;
|
||||||
llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit);
|
llvm::DIType FieldTy = getOrCreateType(Field->getType(), Unit);
|
||||||
|
|
||||||
llvm::StringRef FieldName = Field->getName();
|
llvm::StringRef FieldName = Field->getName();
|
||||||
|
|
||||||
// Ignore unnamed fields. Do not ignore unnamed records.
|
// Ignore unnamed fields. Do not ignore unnamed records.
|
||||||
|
@ -573,7 +572,6 @@ CollectRecordFields(const RecordDecl *RD, llvm::DIFile Unit,
|
||||||
Expr *BitWidth = Field->getBitWidth();
|
Expr *BitWidth = Field->getBitWidth();
|
||||||
if (BitWidth)
|
if (BitWidth)
|
||||||
FieldSize = BitWidth->EvaluateAsInt(CGM.getContext()).getZExtValue();
|
FieldSize = BitWidth->EvaluateAsInt(CGM.getContext()).getZExtValue();
|
||||||
|
|
||||||
FieldAlign = CGM.getContext().getTypeAlign(FType);
|
FieldAlign = CGM.getContext().getTypeAlign(FType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -894,6 +892,31 @@ llvm::DIType CGDebugInfo::CreateType(const RecordType *Ty,
|
||||||
CollectCXXBases(CXXDecl, Unit, EltTys, FwdDecl);
|
CollectCXXBases(CXXDecl, Unit, EltTys, FwdDecl);
|
||||||
CollectVTableInfo(CXXDecl, Unit, EltTys);
|
CollectVTableInfo(CXXDecl, Unit, EltTys);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Collect static variables with initializers.
|
||||||
|
for (RecordDecl::decl_iterator I = RD->decls_begin(), E = RD->decls_end();
|
||||||
|
I != E; ++I)
|
||||||
|
if (const VarDecl *V = dyn_cast<VarDecl>(*I)) {
|
||||||
|
if (const Expr *Init = V->getInit()) {
|
||||||
|
Expr::EvalResult Result;
|
||||||
|
if (Init->Evaluate(Result, CGM.getContext()) && Result.Val.isInt()) {
|
||||||
|
llvm::ConstantInt *CI
|
||||||
|
= llvm::ConstantInt::get(CGM.getLLVMContext(), Result.Val.getInt());
|
||||||
|
|
||||||
|
// Create the descriptor for static variable.
|
||||||
|
llvm::DIFile VUnit = getOrCreateFile(V->getLocation());
|
||||||
|
llvm::StringRef VName = V->getName();
|
||||||
|
llvm::DIType VTy = getOrCreateType(V->getType(), VUnit);
|
||||||
|
// Do not use DIGlobalVariable for enums.
|
||||||
|
if (VTy.getTag() != llvm::dwarf::DW_TAG_enumeration_type) {
|
||||||
|
DebugFactory.CreateGlobalVariable(FwdDecl, VName, VName, VName, VUnit,
|
||||||
|
getLineNumber(V->getLocation()),
|
||||||
|
VTy, true, true, CI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CollectRecordFields(RD, Unit, EltTys);
|
CollectRecordFields(RD, Unit, EltTys);
|
||||||
llvm::MDNode *ContainingType = NULL;
|
llvm::MDNode *ContainingType = NULL;
|
||||||
if (CXXDecl) {
|
if (CXXDecl) {
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
// RUN: %clang -emit-llvm -g -S %s -o - | grep HdrSize
|
||||||
|
struct A {
|
||||||
|
int one;
|
||||||
|
static const int HdrSize = 52;
|
||||||
|
int two;
|
||||||
|
A() {
|
||||||
|
int x = 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
int main() {
|
||||||
|
A a;
|
||||||
|
}
|
Loading…
Reference in New Issue