[Clang][Attr] fix a btf_type_attr CGDebugInfo codegen bug
authorYonghong Song <yhs@fb.com>
Sun, 7 Nov 2021 00:46:40 +0000 (17:46 -0700)
committerYonghong Song <yhs@fb.com>
Sun, 7 Nov 2021 01:19:00 +0000 (18:19 -0700)
Nathan Chancellor reported a crash due to commit
3466e00716e1 (Reland "[Attr] support btf_type_tag attribute").

The following test can reproduce the crash:
  $ cat efi.i
  typedef unsigned long efi_query_variable_info_t(int);
  typedef struct {
    struct {
      efi_query_variable_info_t __attribute__((regparm(0))) * query_variable_info;
    };
  } efi_runtime_services_t;
  efi_runtime_services_t efi_0;
  $ clang -m32 -O2 -g -c -o /dev/null efi.i

The reason is that FunctionTypeLoc.getParam(Idx) may return a
nullptr which should be checked before dereferencing the
result pointer. This patch fixed this issue.

clang/lib/CodeGen/CGDebugInfo.cpp

index 2b95325..1ce56f9 100644 (file)
@@ -1446,9 +1446,10 @@ llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty,
         for (const QualType &ParamType : FPT->param_types()) {
           TypeLoc ParamTL;
           if (Idx < FTL_NumParams) {
-            ParmVarDecl *Param = FTL.getParam(Idx);
-            if (const TypeSourceInfo *TSI = Param->getTypeSourceInfo())
-              ParamTL = TSI->getTypeLoc();
+            if (ParmVarDecl *Param = FTL.getParam(Idx)) {
+              if (const TypeSourceInfo *TSI = Param->getTypeSourceInfo())
+                ParamTL = TSI->getTypeLoc();
+            }
           }
           EltTys.push_back(getOrCreateType(ParamType, Unit, ParamTL));
           Idx++;