mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-21 18:24:23 +00:00
AsmParser/Writer: Handle symbolic constants in DI 'flags:'
Parse (and write) symbolic constants in debug info `flags:` fields. This prevents a readability (and CHECK-ability) regression with the new debug info hierarchy. Old (well, current) assembly, with pretty-printing: !{!"...\\0016387", ...} ; ... [public] [rvalue reference] Flags field without this change: !MDDerivedType(flags: 16387, ...) Flags field with this change: !MDDerivedType(flags: DIFlagPublic | DIFlagRValueReference, ...) As discussed in the review thread, this isn't a final state. Most of these flags correspond to `DW_AT_` symbolic constants, and we might eventually want to support arbitrary attributes in some form. However, as it stands now, some of the flags correspond to other concepts (like `FlagStaticMember`); until things are refactored this is the simplest way to move forward without regressing assembly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230111 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -16,6 +16,7 @@
|
||||
#include "llvm/IR/AutoUpgrade.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/InlineAsm.h"
|
||||
@ -2957,6 +2958,10 @@ struct DwarfLangField : public MDUnsignedField {
|
||||
DwarfLangField() : MDUnsignedField(0, dwarf::DW_LANG_hi_user) {}
|
||||
};
|
||||
|
||||
struct DIFlagField : public MDUnsignedField {
|
||||
DIFlagField() : MDUnsignedField(0, UINT32_MAX) {}
|
||||
};
|
||||
|
||||
struct MDSignedField : public MDFieldImpl<int64_t> {
|
||||
int64_t Min;
|
||||
int64_t Max;
|
||||
@ -3086,6 +3091,43 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name,
|
||||
return false;
|
||||
}
|
||||
|
||||
/// DIFlagField
|
||||
/// ::= uint32
|
||||
/// ::= DIFlagVector
|
||||
/// ::= DIFlagVector '|' DIFlagFwdDecl '|' uint32 '|' DIFlagPublic
|
||||
template <>
|
||||
bool LLParser::ParseMDField(LocTy Loc, StringRef Name, DIFlagField &Result) {
|
||||
assert(Result.Max == UINT32_MAX && "Expected only 32-bits");
|
||||
|
||||
// Parser for a single flag.
|
||||
auto parseFlag = [&](unsigned &Val) {
|
||||
if (Lex.getKind() == lltok::APSInt && !Lex.getAPSIntVal().isSigned())
|
||||
return ParseUInt32(Val);
|
||||
|
||||
if (Lex.getKind() != lltok::DIFlag)
|
||||
return TokError("expected debug info flag");
|
||||
|
||||
Val = DIDescriptor::getFlag(Lex.getStrVal());
|
||||
if (!Val)
|
||||
return TokError(Twine("invalid debug info flag flag '") +
|
||||
Lex.getStrVal() + "'");
|
||||
Lex.Lex();
|
||||
return false;
|
||||
};
|
||||
|
||||
// Parse the flags and combine them together.
|
||||
unsigned Combined = 0;
|
||||
do {
|
||||
unsigned Val;
|
||||
if (parseFlag(Val))
|
||||
return true;
|
||||
Combined |= Val;
|
||||
} while (EatIfPresent(lltok::bar));
|
||||
|
||||
Result.assign(Combined);
|
||||
return false;
|
||||
}
|
||||
|
||||
template <>
|
||||
bool LLParser::ParseMDField(LocTy Loc, StringRef Name,
|
||||
MDSignedField &Result) {
|
||||
@ -3330,7 +3372,7 @@ bool LLParser::ParseMDDerivedType(MDNode *&Result, bool IsDistinct) {
|
||||
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
|
||||
OPTIONAL(align, MDUnsignedField, (0, UINT64_MAX)); \
|
||||
OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); \
|
||||
OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX)); \
|
||||
OPTIONAL(flags, DIFlagField, ); \
|
||||
OPTIONAL(extraData, MDField, );
|
||||
PARSE_MD_FIELDS();
|
||||
#undef VISIT_MD_FIELDS
|
||||
@ -3353,7 +3395,7 @@ bool LLParser::ParseMDCompositeType(MDNode *&Result, bool IsDistinct) {
|
||||
OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
|
||||
OPTIONAL(align, MDUnsignedField, (0, UINT64_MAX)); \
|
||||
OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); \
|
||||
OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX)); \
|
||||
OPTIONAL(flags, DIFlagField, ); \
|
||||
OPTIONAL(elements, MDField, ); \
|
||||
OPTIONAL(runtimeLang, DwarfLangField, ); \
|
||||
OPTIONAL(vtableHolder, MDField, ); \
|
||||
@ -3372,7 +3414,7 @@ bool LLParser::ParseMDCompositeType(MDNode *&Result, bool IsDistinct) {
|
||||
|
||||
bool LLParser::ParseMDSubroutineType(MDNode *&Result, bool IsDistinct) {
|
||||
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
|
||||
OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX)); \
|
||||
OPTIONAL(flags, DIFlagField, ); \
|
||||
REQUIRED(types, MDField, );
|
||||
PARSE_MD_FIELDS();
|
||||
#undef VISIT_MD_FIELDS
|
||||
@ -3449,7 +3491,7 @@ bool LLParser::ParseMDSubprogram(MDNode *&Result, bool IsDistinct) {
|
||||
OPTIONAL(containingType, MDField, ); \
|
||||
OPTIONAL(virtuality, DwarfVirtualityField, ); \
|
||||
OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
|
||||
OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX)); \
|
||||
OPTIONAL(flags, DIFlagField, ); \
|
||||
OPTIONAL(isOptimized, MDBoolField, ); \
|
||||
OPTIONAL(function, MDConstant, ); \
|
||||
OPTIONAL(templateParams, MDField, ); \
|
||||
@ -3585,7 +3627,7 @@ bool LLParser::ParseMDLocalVariable(MDNode *&Result, bool IsDistinct) {
|
||||
OPTIONAL(line, LineField, ); \
|
||||
OPTIONAL(type, MDField, ); \
|
||||
OPTIONAL(arg, MDUnsignedField, (0, UINT8_MAX)); \
|
||||
OPTIONAL(flags, MDUnsignedField, (0, UINT32_MAX)); \
|
||||
OPTIONAL(flags, DIFlagField, ); \
|
||||
OPTIONAL(inlinedAt, MDField, );
|
||||
PARSE_MD_FIELDS();
|
||||
#undef VISIT_MD_FIELDS
|
||||
|
Reference in New Issue
Block a user