[lld] r307726 - [PDB] Tweak bad type index error handling
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 11 15:42:08 PDT 2017
On Tue, Jul 11, 2017 at 3:37 PM, Reid Kleckner via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: rnk
> Date: Tue Jul 11 15:37:50 2017
> New Revision: 307726
>
> URL: http://llvm.org/viewvc/llvm-project?rev=307726&view=rev
> Log:
> [PDB] Tweak bad type index error handling
>
> Translate invalid type indices to a sentinel value instead of skipping
> the record. Skipping records isn't a good recovery method, because we
> can skip a scope open or close record, which will confuse the scope
> management code.
>
> We currently have lots of invalid type indices on Microsoft-provided
> standard libraries, because the LF_TYPESERVER2 records contain absolute
> paths that are only valid on their build servers. Our type server
> handlers need to look at other things (GUIDs) to find these type server
> PDBs.
>
> Added:
> lld/trunk/test/COFF/pdb-invalid-func-type.yaml
> Modified:
> lld/trunk/COFF/PDB.cpp
>
> Modified: lld/trunk/COFF/PDB.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.
> cpp?rev=307726&r1=307725&r2=307726&view=diff
> ============================================================
> ==================
> --- lld/trunk/COFF/PDB.cpp (original)
> +++ lld/trunk/COFF/PDB.cpp Tue Jul 11 15:37:50 2017
> @@ -125,26 +125,25 @@ static bool remapTypeIndex(TypeIndex &TI
> return true;
> }
>
> -static bool remapTypesInSymbolRecord(ObjectFile *File,
> +static void remapTypesInSymbolRecord(ObjectFile *File,
> MutableArrayRef<uint8_t> Contents,
> ArrayRef<TypeIndex> TypeIndexMap,
> ArrayRef<TiReference> TypeRefs) {
> for (const TiReference &Ref : TypeRefs) {
> unsigned ByteSize = Ref.Count * sizeof(TypeIndex);
> - if (Contents.size() < Ref.Offset + ByteSize) {
> - log("ignoring short symbol record");
> - return false;
> - }
> + if (Contents.size() < Ref.Offset + ByteSize)
> + fatal("ignoring short symbol record");
>
If you use `fatal`, it doesn't ignore records but exits immediately.
MutableArrayRef<TypeIndex> TIs(
> reinterpret_cast<TypeIndex *>(Contents.data() + Ref.Offset),
> Ref.Count);
> - for (TypeIndex &TI : TIs)
> + for (TypeIndex &TI : TIs) {
> if (!remapTypeIndex(TI, TypeIndexMap)) {
> + TI = TypeIndex(SimpleTypeKind::NotTranslated);
> log("ignoring symbol record in " + File->getName() +
> " with bad type index 0x" + utohexstr(TI.getIndex()));
> - return false;
> + continue;
> }
> + }
> }
> - return true;
> }
>
> /// MSVC translates S_PROC_ID_END to S_END.
> @@ -265,8 +264,7 @@ static void mergeSymbolRecords(BumpPtrAl
> // Re-map all the type index references.
> MutableArrayRef<uint8_t> Contents =
> NewData.drop_front(sizeof(RecordPrefix));
> - if (!remapTypesInSymbolRecord(File, Contents, TypeIndexMap,
> TypeRefs))
> - continue;
> + remapTypesInSymbolRecord(File, Contents, TypeIndexMap, TypeRefs);
>
> // Fill in "Parent" and "End" fields by maintaining a stack of scopes.
> CVSymbol NewSym(Sym.kind(), NewData);
>
> Added: lld/trunk/test/COFF/pdb-invalid-func-type.yaml
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/
> pdb-invalid-func-type.yaml?rev=307726&view=auto
> ============================================================
> ==================
> --- lld/trunk/test/COFF/pdb-invalid-func-type.yaml (added)
> +++ lld/trunk/test/COFF/pdb-invalid-func-type.yaml Tue Jul 11 15:37:50
> 2017
> @@ -0,0 +1,146 @@
> +# This test has an S_GPROC32_ID symbol with an invalid type index. Make
> sure we
> +# keep the record, or we'll have unbalanced scopes, which is bad. This
> situation
> +# can arise when we can't find the type server PDB.
> +
> +# RUN: yaml2obj %s -o %t.obj
> +# RUN: lld-link %t.obj -out:%t.exe -debug -pdb:%t.pdb -nodefaultlib
> -entry:main
> +# RUN: llvm-pdbutil dump -symbols %t.pdb | FileCheck %s
> +
> +# CHECK: Mod 0000 | `{{.*}}pdb-invalid-func-type.yaml.tmp.obj`:
> +# CHECK: 4 | S_GPROC32_ID [size = 44] `main`
> +# CHECK: parent = 0, end = 80, addr = 0000:0000, code size = 3
> +# CHECK: 48 | S_FRAMEPROC [size = 32]
> +# CHECK: 80 | S_END [size = 4]
> +
> +--- !COFF
> +header:
> + Machine: IMAGE_FILE_MACHINE_AMD64
> + Characteristics: [ ]
> +sections:
> + - Name: '.debug$S'
> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
> + Alignment: 1
> + Subsections:
> + - !Symbols
> + Records:
> + - Kind: S_GPROC32_ID
> + ProcSym:
> + CodeSize: 3
> + DbgStart: 0
> + DbgEnd: 2
> + # Corrupt function type!
> + FunctionType: 4101
> + Flags: [ ]
> + DisplayName: main
> + - Kind: S_FRAMEPROC
> + FrameProcSym:
> + TotalFrameBytes: 0
> + PaddingFrameBytes: 0
> + OffsetToPadding: 0
> + BytesOfCalleeSavedRegisters: 0
> + OffsetOfExceptionHandler: 0
> + SectionIdOfExceptionHandler: 0
> + Flags: [ AsynchronousExceptionHandling,
> OptimizedForSpeed ]
> + - Kind: S_PROC_ID_END
> + ScopeEndSym:
> + - !Lines
> + CodeSize: 3
> + Flags: [ ]
> + RelocOffset: 0
> + RelocSegment: 0
> + Blocks:
> + - FileName: 'c:\src\llvm-project\build\t.c'
> + Lines:
> + - Offset: 0
> + LineStart: 1
> + IsStatement: true
> + EndDelta: 0
> + Columns:
> + - !FileChecksums
> + Checksums:
> + - FileName: 'c:\src\llvm-project\build\t.c'
> + Kind: MD5
> + Checksum: 270A878DCC1B845655B162F56C4F5020
> + - !StringTable
> + Strings:
> + - 'c:\src\llvm-project\build\t.c'
> + Relocations:
> + - VirtualAddress: 152
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECREL
> + - VirtualAddress: 156
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECTION
> + - VirtualAddress: 208
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECREL
> + - VirtualAddress: 212
> + SymbolName: main
> + Type: IMAGE_REL_AMD64_SECTION
> + - Name: '.debug$T'
> + Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA,
> IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
> + Alignment: 1
> + Types:
> + - Kind: LF_ARGLIST
> + ArgList:
> + ArgIndices: [ 0 ]
> + - Kind: LF_PROCEDURE
> + Procedure:
> + ReturnType: 116
> + CallConv: NearC
> + Options: [ None ]
> + ParameterCount: 0
> + ArgumentList: 4096
> + - Kind: LF_FUNC_ID
> + FuncId:
> + ParentScope: 0
> + FunctionType: 4097
> + Name: main
> + - Name: '.text$mn'
> + Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
> IMAGE_SCN_MEM_READ ]
> + Alignment: 16
> + SectionData: 33C0C3
> +symbols:
> + - Name: '.debug$S'
> + Value: 0
> + SectionNumber: 1
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + SectionDefinition:
> + Length: 328
> + NumberOfRelocations: 4
> + NumberOfLinenumbers: 0
> + CheckSum: 0
> + Number: 0
> + - Name: '.debug$T'
> + Value: 0
> + SectionNumber: 2
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + SectionDefinition:
> + Length: 564
> + NumberOfRelocations: 0
> + NumberOfLinenumbers: 0
> + CheckSum: 0
> + Number: 0
> + - Name: '.text$mn'
> + Value: 0
> + SectionNumber: 3
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_NULL
> + StorageClass: IMAGE_SYM_CLASS_STATIC
> + SectionDefinition:
> + Length: 3
> + NumberOfRelocations: 0
> + NumberOfLinenumbers: 0
> + CheckSum: 4021952397
> + Number: 0
> + - Name: main
> + Value: 0
> + SectionNumber: 3
> + SimpleType: IMAGE_SYM_TYPE_NULL
> + ComplexType: IMAGE_SYM_DTYPE_FUNCTION
> + StorageClass: IMAGE_SYM_CLASS_EXTERNAL
> +...
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170711/b775ad35/attachment.html>
More information about the llvm-commits
mailing list