forked from OSchip/llvm-project
LLParser: Require non-null scope for MDLocation and MDLocalVariable
Change `LLParser` to require a non-null `scope:` field for both `MDLocation` and `MDLocalVariable`. There's no need to wait for the verifier for this check. This also allows their `::getImpl()` methods to assert that the incoming scope is non-null. llvm-svn: 233394
This commit is contained in:
parent
463a0afe15
commit
e2c61d9eec
llvm
lib
test
Assembler
CodeGen
|
@ -3030,7 +3030,9 @@ struct MDBoolField : public MDFieldImpl<bool> {
|
||||||
MDBoolField(bool Default = false) : ImplTy(Default) {}
|
MDBoolField(bool Default = false) : ImplTy(Default) {}
|
||||||
};
|
};
|
||||||
struct MDField : public MDFieldImpl<Metadata *> {
|
struct MDField : public MDFieldImpl<Metadata *> {
|
||||||
MDField() : ImplTy(nullptr) {}
|
bool AllowNull;
|
||||||
|
|
||||||
|
MDField(bool AllowNull = true) : ImplTy(nullptr), AllowNull(AllowNull) {}
|
||||||
};
|
};
|
||||||
struct MDConstant : public MDFieldImpl<ConstantAsMetadata *> {
|
struct MDConstant : public MDFieldImpl<ConstantAsMetadata *> {
|
||||||
MDConstant() : ImplTy(nullptr) {}
|
MDConstant() : ImplTy(nullptr) {}
|
||||||
|
@ -3221,6 +3223,8 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDBoolField &Result) {
|
||||||
template <>
|
template <>
|
||||||
bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDField &Result) {
|
bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDField &Result) {
|
||||||
if (Lex.getKind() == lltok::kw_null) {
|
if (Lex.getKind() == lltok::kw_null) {
|
||||||
|
if (!Result.AllowNull)
|
||||||
|
return TokError("'" + Name + "' cannot be null");
|
||||||
Lex.Lex();
|
Lex.Lex();
|
||||||
Result.assign(nullptr);
|
Result.assign(nullptr);
|
||||||
return false;
|
return false;
|
||||||
|
@ -3343,7 +3347,7 @@ bool LLParser::ParseMDLocation(MDNode *&Result, bool IsDistinct) {
|
||||||
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
|
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
|
||||||
OPTIONAL(line, LineField, ); \
|
OPTIONAL(line, LineField, ); \
|
||||||
OPTIONAL(column, ColumnField, ); \
|
OPTIONAL(column, ColumnField, ); \
|
||||||
REQUIRED(scope, MDField, ); \
|
REQUIRED(scope, MDField, (/* AllowNull */ false)); \
|
||||||
OPTIONAL(inlinedAt, MDField, );
|
OPTIONAL(inlinedAt, MDField, );
|
||||||
PARSE_MD_FIELDS();
|
PARSE_MD_FIELDS();
|
||||||
#undef VISIT_MD_FIELDS
|
#undef VISIT_MD_FIELDS
|
||||||
|
@ -3675,7 +3679,7 @@ bool LLParser::ParseMDGlobalVariable(MDNode *&Result, bool IsDistinct) {
|
||||||
bool LLParser::ParseMDLocalVariable(MDNode *&Result, bool IsDistinct) {
|
bool LLParser::ParseMDLocalVariable(MDNode *&Result, bool IsDistinct) {
|
||||||
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
|
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
|
||||||
REQUIRED(tag, DwarfTagField, ); \
|
REQUIRED(tag, DwarfTagField, ); \
|
||||||
REQUIRED(scope, MDField, ); \
|
REQUIRED(scope, MDField, (/* AllowNull */ false)); \
|
||||||
OPTIONAL(name, MDStringField, ); \
|
OPTIONAL(name, MDStringField, ); \
|
||||||
OPTIONAL(file, MDField, ); \
|
OPTIONAL(file, MDField, ); \
|
||||||
OPTIONAL(line, LineField, ); \
|
OPTIONAL(line, LineField, ); \
|
||||||
|
|
|
@ -44,6 +44,7 @@ MDLocation *MDLocation::getImpl(LLVMContext &Context, unsigned Line,
|
||||||
// Fixup column.
|
// Fixup column.
|
||||||
adjustColumn(Column);
|
adjustColumn(Column);
|
||||||
|
|
||||||
|
assert(Scope && "Expected scope");
|
||||||
if (Storage == Uniqued) {
|
if (Storage == Uniqued) {
|
||||||
if (auto *N =
|
if (auto *N =
|
||||||
getUniqued(Context.pImpl->MDLocations,
|
getUniqued(Context.pImpl->MDLocations,
|
||||||
|
@ -345,6 +346,7 @@ MDLocalVariable *MDLocalVariable::getImpl(
|
||||||
// it matches historical behaviour for now.
|
// it matches historical behaviour for now.
|
||||||
Arg &= (1u << 8) - 1;
|
Arg &= (1u << 8) - 1;
|
||||||
|
|
||||||
|
assert(Scope && "Expected scope");
|
||||||
assert(isCanonical(Name) && "Expected canonical MDString");
|
assert(isCanonical(Name) && "Expected canonical MDString");
|
||||||
DEFINE_GETIMPL_LOOKUP(MDLocalVariable, (Tag, Scope, getString(Name), File,
|
DEFINE_GETIMPL_LOOKUP(MDLocalVariable, (Tag, Scope, getString(Name), File,
|
||||||
Line, Type, Arg, Flags, InlinedAt));
|
Line, Type, Arg, Flags, InlinedAt));
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: <stdin>:[[@LINE+1]]:30: error: 'scope' cannot be null
|
||||||
|
!0 = !MDLocalVariable(scope: null)
|
|
@ -0,0 +1,4 @@
|
||||||
|
; RUN: not llvm-as < %s -disable-output 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
; CHECK: <stdin>:[[@LINE+1]]:25: error: 'scope' cannot be null
|
||||||
|
!0 = !MDLocation(scope: null)
|
|
@ -11,4 +11,4 @@ define void @t(%0*, i32, i32, i32, i32) nounwind {
|
||||||
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnone
|
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnone
|
||||||
|
|
||||||
; !0 should conform to the format of DIVariable.
|
; !0 should conform to the format of DIVariable.
|
||||||
!0 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "a", arg: 0, scope: null)
|
!0 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "a", arg: 0, scope: !MDSubprogram())
|
||||||
|
|
|
@ -78,6 +78,6 @@ attributes #2 = { nounwind readnone }
|
||||||
|
|
||||||
!17 = !MDDerivedType(tag: DW_TAG_reference_type, baseType: null)
|
!17 = !MDDerivedType(tag: DW_TAG_reference_type, baseType: null)
|
||||||
!45 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: null)
|
!45 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: null)
|
||||||
!62 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "arg", line: 4, arg: 2, scope: null, type: !17)
|
!62 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "arg", line: 4, arg: 2, scope: !MDSubprogram(), type: !17)
|
||||||
!64 = !{%struct.Flibble* undef}
|
!64 = !{%struct.Flibble* undef}
|
||||||
!65 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "this", line: 13, arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: null, type: !45)
|
!65 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "this", line: 13, arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !MDSubprogram(), type: !45)
|
||||||
|
|
Loading…
Reference in New Issue