diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-02-21 01:02:18 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-02-21 01:02:18 +0000 |
commit | 70ab3d2af667a97523d2ab4f03b0d2f978693f47 (patch) | |
tree | 919c0b0fac56a22397ceba0d966be3dd0aec310f /llvm/lib/IR/AsmWriter.cpp | |
parent | c32f3faae9c7128dec280b8274de31400df5e704 (diff) | |
download | bcm5719-llvm-70ab3d2af667a97523d2ab4f03b0d2f978693f47.tar.gz bcm5719-llvm-70ab3d2af667a97523d2ab4f03b0d2f978693f47.zip |
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.
llvm-svn: 230111
Diffstat (limited to 'llvm/lib/IR/AsmWriter.cpp')
-rw-r--r-- | llvm/lib/IR/AsmWriter.cpp | 49 |
1 files changed, 37 insertions, 12 deletions
diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 47a1b5512a9..104ad4f0be3 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1275,14 +1275,15 @@ static void writeMDTuple(raw_ostream &Out, const MDTuple *Node, namespace { struct FieldSeparator { bool Skip; - FieldSeparator() : Skip(true) {} + const char *Sep; + FieldSeparator(const char *Sep = ", ") : Skip(true), Sep(Sep) {} }; raw_ostream &operator<<(raw_ostream &OS, FieldSeparator &FS) { if (FS.Skip) { FS.Skip = false; return OS; } - return OS << ", "; + return OS << FS.Sep; } } // end namespace @@ -1387,6 +1388,20 @@ static void writeMDBasicType(raw_ostream &Out, const MDBasicType *N, Out << ")"; } +static void writeDIFlags(raw_ostream &Out, unsigned Flags) { + SmallVector<unsigned, 8> SplitFlags; + unsigned Extra = DIDescriptor::splitFlags(Flags, SplitFlags); + + FieldSeparator FS(" | "); + for (unsigned F : SplitFlags) { + const char *StringF = DIDescriptor::getFlagString(F); + assert(StringF && "Expected valid flag"); + Out << FS << StringF; + } + if (Extra || SplitFlags.empty()) + Out << FS << Extra; +} + static void writeMDDerivedType(raw_ostream &Out, const MDDerivedType *N, TypePrinting *TypePrinter, SlotTracker *Machine, const Module *Context) { @@ -1414,8 +1429,10 @@ static void writeMDDerivedType(raw_ostream &Out, const MDDerivedType *N, Out << FS << "align: " << N->getAlignInBits(); if (N->getOffsetInBits()) Out << FS << "offset: " << N->getOffsetInBits(); - if (N->getFlags()) - Out << FS << "flags: " << N->getFlags(); + if (auto Flags = N->getFlags()) { + Out << FS << "flags: "; + writeDIFlags(Out, Flags); + } if (N->getExtraData()) { Out << FS << "extraData: "; writeMetadataAsOperand(Out, N->getExtraData(), TypePrinter, Machine, @@ -1454,8 +1471,10 @@ static void writeMDCompositeType(raw_ostream &Out, const MDCompositeType *N, Out << FS << "align: " << N->getAlignInBits(); if (N->getOffsetInBits()) Out << FS << "offset: " << N->getOffsetInBits(); - if (N->getFlags()) - Out << FS << "flags: " << N->getFlags(); + if (auto Flags = N->getFlags()) { + Out << FS << "flags: "; + writeDIFlags(Out, Flags); + } if (N->getElements()) { Out << FS << "elements: "; writeMetadataAsOperand(Out, N->getElements(), TypePrinter, Machine, @@ -1489,8 +1508,10 @@ static void writeMDSubroutineType(raw_ostream &Out, const MDSubroutineType *N, SlotTracker *Machine, const Module *Context) { Out << "!MDSubroutineType("; FieldSeparator FS; - if (N->getFlags()) - Out << FS << "flags: " << N->getFlags(); + if (auto Flags = N->getFlags()) { + Out << FS << "flags: "; + writeDIFlags(Out, Flags); + } Out << FS << "types: "; writeMetadataAsOperand(Out, N->getTypeArray(), TypePrinter, Machine, Context); Out << ")"; @@ -1594,8 +1615,10 @@ static void writeMDSubprogram(raw_ostream &Out, const MDSubprogram *N, } if (N->getVirtualIndex()) Out << FS << "virtualIndex: " << N->getVirtualIndex(); - if (N->getFlags()) - Out << FS << "flags: " << N->getFlags(); + if (auto Flags = N->getFlags()) { + Out << FS << "flags: "; + writeDIFlags(Out, Flags); + } Out << FS << "isOptimized: " << (N->isOptimized() ? "true" : "false"); if (N->getFunction()) { Out << FS << "function: "; @@ -1764,8 +1787,10 @@ static void writeMDLocalVariable(raw_ostream &Out, const MDLocalVariable *N, } if (N->getTag() == dwarf::DW_TAG_arg_variable || N->getArg()) Out << FS << "arg: " << N->getArg(); - if (N->getFlags()) - Out << FS << "flags: " << N->getFlags(); + if (auto Flags = N->getFlags()) { + Out << FS << "flags: "; + writeDIFlags(Out, Flags); + } if (N->getInlinedAt()) { Out << FS << "inlinedAt: "; writeMetadataAsOperand(Out, N->getInlinedAt(), TypePrinter, Machine, |