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 | |
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
-rw-r--r-- | llvm/test/tools/llvm-dwp/Inputs/invalid_string_form.dwo | bin | 0 -> 1153 bytes | |||
-rw-r--r-- | llvm/test/tools/llvm-dwp/X86/invalid_string_form.test | 3 | ||||
-rw-r--r-- | llvm/tools/llvm-dwp/llvm-dwp.cpp | 24 |
3 files changed, 19 insertions, 8 deletions
diff --git a/llvm/test/tools/llvm-dwp/Inputs/invalid_string_form.dwo b/llvm/test/tools/llvm-dwp/Inputs/invalid_string_form.dwo Binary files differnew file mode 100644 index 00000000000..663c70fd7f7 --- /dev/null +++ b/llvm/test/tools/llvm-dwp/Inputs/invalid_string_form.dwo diff --git a/llvm/test/tools/llvm-dwp/X86/invalid_string_form.test b/llvm/test/tools/llvm-dwp/X86/invalid_string_form.test new file mode 100644 index 00000000000..e78a145dcb5 --- /dev/null +++ b/llvm/test/tools/llvm-dwp/X86/invalid_string_form.test @@ -0,0 +1,3 @@ +RUN: not llvm-dwp %p/../Inputs/invalid_string_form.dwo -o %t 2>&1 | FileCheck %s + +CHECK: error: string field encoded without DW_FORM_string or DW_FORM_GNU_str_index 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: |