From 576d77bf758cc2c8a1350a5b39ae12f6c80924d0 Mon Sep 17 00:00:00 2001 From: z30060698 Date: Fri, 7 Feb 2025 16:38:49 +0800 Subject: [PATCH] [PAC] Fix DFI not Take Effect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 描述: 当结构体的定义不完整时,DFI失效。 Issue:[PAC] Fix DFI not Take Effect #IBKP2J :【PAC】The DFI attribute did not take effect because the data structure was not completely defined. 测试: Signed-off-by: zhangjing --- clang/include/clang/Pac/PacDfi.h | 10 +++-- clang/lib/Pac/PacDfi.cpp | 70 ++++++++++++++++++++++---------- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/clang/include/clang/Pac/PacDfi.h b/clang/include/clang/Pac/PacDfi.h index e4b8ea50381f..f1951a64ff01 100644 --- a/clang/include/clang/Pac/PacDfi.h +++ b/clang/include/clang/Pac/PacDfi.h @@ -21,9 +21,13 @@ #include using namespace clang; -void PacDfiParseStruct(RecordDecl *TagDecl, ASTContext &Ctx, DiagnosticsEngine &Diags); -void PacDfiEmitStructFieldsMetadata(llvm::Module &M, CodeGen::CodeGenModule *CGM, - std::function func); +void PacDfiParseStruct(RecordDecl *TagDecl, ASTContext &Ctx, + DiagnosticsEngine &Diags); +void PacDfiEmitStructFieldsMetadata( + llvm::Module &M, CodeGen::CodeGenModule *CGM, + std::function + func); void PacDfiRecordDecl2StructName(const RecordDecl *RD, llvm::StructType *Entry); #endif diff --git a/clang/lib/Pac/PacDfi.cpp b/clang/lib/Pac/PacDfi.cpp index d73e16edf888..84c4d3dcfde9 100644 --- a/clang/lib/Pac/PacDfi.cpp +++ b/clang/lib/Pac/PacDfi.cpp @@ -171,29 +171,53 @@ void PacDfiParseStruct(RecordDecl *TagDecl, ASTContext &Ctx, DiagnosticsEngine & } } -void PacDfiCreateMetaData(std::map> &fieldInfos, StringRef mdName, - llvm::Module &M, CodeGen::CodeGenModule *CGM, - std::function func) -{ - llvm::NamedMDNode *PacNMD = M.getOrInsertNamedMetadata(mdName); - llvm::NamedMDNode *PacNMDName = M.getOrInsertNamedMetadata(mdName.str() + "name"); - for (auto item : fieldInfos) { - if (RecordDecl2StructName.find(item.first) == RecordDecl2StructName.end()) { - continue; +bool getStructNameFromRecord(const RecordDecl *Record, StringRef &Name) { + auto Item = RecordDecl2StructName.find(Record); + if (Item != RecordDecl2StructName.end()) { + Name = Item->second; + return true; + } + auto PreRecord = Record->getPreviousDecl(); + while (PreRecord) { + auto PreItem = RecordDecl2StructName.find(PreRecord); + if (PreItem != RecordDecl2StructName.end()) { + Name = PreItem->second; + return true; } + PreRecord = PreRecord->getPreviousDecl(); + } + return false; +} + +void pacDfiCreateNameMetaData( + std::map> &FieldInfos, + StringRef MDName, llvm::Module &M, CodeGen::CodeGenModule *CGM, + std::function + Func) { + llvm::NamedMDNode *PacNMD = M.getOrInsertNamedMetadata(MDName); + llvm::NamedMDNode *PacNMDName = + M.getOrInsertNamedMetadata(MDName.str() + "name"); + for (auto Item : FieldInfos) { std::vector PacFields; std::vector PacFieldsName; - auto styName = RecordDecl2StructName.find(item.first)->second; - PacFields.push_back(llvm::MDString::get(M.getContext(), styName)); - PacFieldsName.push_back(llvm::MDString::get(M.getContext(), styName)); - for (auto *Field : item.second) { - PacFieldsName.push_back(llvm::MDString::get(M.getContext(), Field->getName())); - unsigned idx = func(*CGM, item.first, Field); - PacFields.push_back(llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( - llvm::Type::getInt32Ty(M.getContext()), idx))); + StringRef StyName; + if (!getStructNameFromRecord(Item.first, StyName)) { + continue; + } + PacFields.push_back(llvm::MDString::get(M.getContext(), StyName)); + PacFieldsName.push_back(llvm::MDString::get(M.getContext(), StyName)); + for (auto *Field : Item.second) { + PacFieldsName.push_back( + llvm::MDString::get(M.getContext(), Field->getName())); + unsigned Idx = Func(*CGM, Item.first, Field); + PacFields.push_back( + llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( + llvm::Type::getInt32Ty(M.getContext()), Idx))); } PacNMD->addOperand(llvm::MDNode::get(M.getContext(), PacFields)); - PacNMDName->addOperand(llvm::MDNode::get(M.getContext(), PacFieldsName)); + PacNMDName->addOperand( + llvm::MDNode::get(M.getContext(), PacFieldsName)); } } @@ -205,16 +229,18 @@ void PacDfiEmitStructFieldsMetadata(llvm::Module &M, CodeGen::CodeGenModule *CGM } // emit struct fields that need to protect with PA if (!PacFieldNameInfos.empty()) { - PacDfiCreateMetaData(PacFieldNameInfos, "pa_field_info", M, CGM, func); + pacDfiCreateNameMetaData(PacFieldNameInfos, "pa_field_info", M, CGM, + func); } if (!PacPtrNameInfos.empty()) { - PacDfiCreateMetaData(PacPtrNameInfos, "pa_ptr_field_info", M, CGM, func); + pacDfiCreateNameMetaData(PacPtrNameInfos, "pa_ptr_field_info", M, CGM, + func); } if (!PacFieldExclNameInfos.empty()) { - PacDfiCreateMetaData(PacFieldExclNameInfos, "pa_excl_field_info", M, CGM, func); + pacDfiCreateNameMetaData(PacFieldExclNameInfos, "pa_excl_field_info", M, CGM, func); } if (!PacFieldSeqlNameInfos.empty()) { - PacDfiCreateMetaData(PacFieldSeqlNameInfos, "pa_seql_field_info", M, CGM, func); + pacDfiCreateNameMetaData(PacFieldSeqlNameInfos, "pa_seql_field_info", M, CGM, func); } } -- Gitee