diff options
-rw-r--r-- | lld/ELF/OutputSections.cpp | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 936c00e90af..92e6c9ba1f5 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -943,21 +943,20 @@ uint8_t EHOutputSection<ELFT>::getFdeEncoding(ArrayRef<uint8_t> D) { // We only care about an 'R' value, but other records may precede an 'R' // record. Records are not in TLV (type-length-value) format, so we need // to teach the linker how to skip records for each type. - for (; !Aug.empty(); Aug = Aug.substr(1)) { - switch (Aug[0]) { - case 'z': - skipLeb128(D); - break; - case 'R': + for (char C : Aug) { + if (C == 'R') return readByte(D); - case 'P': + if (C == 'z') { + skipLeb128(D); + continue; + } + if (C == 'P') { skipAugP<ELFT>(D); - break; - case 'L': - break; - default: - fatal("unknown .eh_frame augmentation string: " + Aug); + continue; } + if (C == 'L') + continue; + fatal("unknown .eh_frame augmentation string: " + Aug); } return DW_EH_PE_absptr; } |