[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