diff options
author | David Blaikie <dblaikie@gmail.com> | 2016-05-17 00:07:10 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2016-05-17 00:07:10 +0000 |
commit | 4940f87bcc1aa3aa048b3c38c7013d7a385cac4f (patch) | |
tree | a01ae54c2b4440e76f4102c5b01f8714a21850d2 /llvm/tools/llvm-dwp/llvm-dwp.cpp | |
parent | 01d98ba0b22bfb152a3db85cac7fcb23d9cb5c85 (diff) | |
download | bcm5719-llvm-4940f87bcc1aa3aa048b3c38c7013d7a385cac4f.tar.gz bcm5719-llvm-4940f87bcc1aa3aa048b3c38c7013d7a385cac4f.zip |
llvm-dwp: Provide error handling for invalid string field forms
This diagnostic could be improved by adding the name of the input file
containing the invalid data and/or some information about how to
identify the specific offending attribute/tag in the input. But that's
not an immediate priority as these corner cases of invalid input
shouldn't come up too often.
llvm-svn: 269727
Diffstat (limited to 'llvm/tools/llvm-dwp/llvm-dwp.cpp')
-rw-r--r-- | llvm/tools/llvm-dwp/llvm-dwp.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp b/llvm/tools/llvm-dwp/llvm-dwp.cpp index 31b2f63eb0a..a05736ebe21 100644 --- a/llvm/tools/llvm-dwp/llvm-dwp.cpp +++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp @@ -125,14 +125,14 @@ struct CompileUnitIdentifiers { const char *DWOName = ""; }; -static const char *getIndexedString(uint32_t Form, DataExtractor InfoData, - uint32_t &InfoOffset, StringRef StrOffsets, - StringRef Str) { +static Expected<const char *> +getIndexedString(uint32_t Form, DataExtractor InfoData, uint32_t &InfoOffset, + StringRef StrOffsets, StringRef Str) { if (Form == dwarf::DW_FORM_string) return InfoData.getCStr(&InfoOffset); - assert(Form == dwarf::DW_FORM_GNU_str_index && "Only string and str_index " - "forms are supported for DWP " - "string attributes"); + if (Form != dwarf::DW_FORM_GNU_str_index) + return make_error<DWPError>( + "string field encoded without DW_FORM_string or DW_FORM_GNU_str_index"); auto StrIndex = InfoData.getULEB128(&InfoOffset); DataExtractor StrOffsetsData(StrOffsets, true, 0); uint32_t StrOffsetsOffset = 4 * StrIndex; @@ -169,11 +169,19 @@ static Expected<CompileUnitIdentifiers> getCUIdentifiers(StringRef Abbrev, (Name != 0 || Form != 0)) { switch (Name) { case dwarf::DW_AT_name: { - ID.Name = getIndexedString(Form, InfoData, Offset, StrOffsets, Str); + Expected<const char *> EName = + getIndexedString(Form, InfoData, Offset, StrOffsets, Str); + if (!EName) + return EName.takeError(); + ID.Name = *EName; break; } case dwarf::DW_AT_GNU_dwo_name: { - ID.DWOName = getIndexedString(Form, InfoData, Offset, StrOffsets, Str); + Expected<const char *> EName = + getIndexedString(Form, InfoData, Offset, StrOffsets, Str); + if (!EName) + return EName.takeError(); + ID.DWOName = *EName; break; } case dwarf::DW_AT_GNU_dwo_id: |