diff --git a/clang/include/clang/Pac/PacDfi.h b/clang/include/clang/Pac/PacDfi.h index 0d028417cdcc56b218a139d0674719d19dc26a2f..e4b8ea50381f3f798fe6bdd2278d2a44f60a2595 100644 --- a/clang/include/clang/Pac/PacDfi.h +++ b/clang/include/clang/Pac/PacDfi.h @@ -18,10 +18,12 @@ #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Module.h" #include "clang/CodeGen/CodeGenABITypes.h" +#include using namespace clang; void PacDfiParseStruct(RecordDecl *TagDecl, ASTContext &Ctx, DiagnosticsEngine &Diags); -void PacDfiEmitStructFieldsMetadata(llvm::Module &M, llvm::LLVMContext &VMContext, CodeGen::CodeGenModule *CGM); +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/CodeGen/CMakeLists.txt b/clang/lib/CodeGen/CMakeLists.txt index 60a45250389dddbac9e2f41e0ff52923c7aa1c6c..4e5a61171c9fb474fc3eed53d57d954e437aa615 100644 --- a/clang/lib/CodeGen/CMakeLists.txt +++ b/clang/lib/CodeGen/CMakeLists.txt @@ -25,6 +25,7 @@ set(LLVM_LINK_COMPONENTS Support Target TransformUtils + Parts # OHOS_LOCAL ) add_clang_library(clangCodeGen diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 511e390e8aafe8193bdd576167c1564220fbe5bd..a6144180f9c906c78551b7145964f5838890768b 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -838,7 +838,7 @@ void CodeGenModule::Release() { if (getLangOpts().OpenMPIsDevice) getModule().addModuleFlag(llvm::Module::Max, "openmp-device", LangOpts.OpenMP); - PacDfiEmitStructFieldsMetadata(getModule(), VMContext, this); // OHOS_LOCAL + PacDfiEmitStructFieldsMetadata(getModule(), this, CodeGen::getLLVMFieldNumber); // OHOS_LOCAL // Emit OpenCL specific module metadata: OpenCL/SPIR version. if (LangOpts.OpenCL || (LangOpts.CUDAIsDevice && getTriple().isSPIRV())) { diff --git a/clang/lib/Pac/CMakeLists.txt b/clang/lib/Pac/CMakeLists.txt index 315da8543dd7f39ba751f4d28f26017e4c8c0e31..12f899691eb096bab96b19018108aa3f9cc962b9 100644 --- a/clang/lib/Pac/CMakeLists.txt +++ b/clang/lib/Pac/CMakeLists.txt @@ -1,7 +1,12 @@ +set(LLVM_LINK_COMPONENTS + Support + Core + Parts +) add_clang_library(pacDfi PacDfi.cpp LINK_LIBS - LLVMParts - clangCodeGen + clangAST + clangBasic ) diff --git a/clang/lib/Pac/PacDfi.cpp b/clang/lib/Pac/PacDfi.cpp index 308d734193fb5710ff429b58b1ff6b68a33b2cde..2a2e502f4e252d269d2690c5c55197fa251d7a42 100644 --- a/clang/lib/Pac/PacDfi.cpp +++ b/clang/lib/Pac/PacDfi.cpp @@ -88,7 +88,8 @@ void PacDfiParseStruct(RecordDecl *TagDecl, ASTContext &Ctx, DiagnosticsEngine & } void PacDfiCreateMetaData(std::map> &fieldInfos, StringRef mdName, - llvm::Module &M, llvm::LLVMContext &VMContext, CodeGen::CodeGenModule *CGM) + llvm::Module &M, CodeGen::CodeGenModule *CGM, + std::function func) { llvm::NamedMDNode *PacNMD = M.getOrInsertNamedMetadata(mdName); llvm::NamedMDNode *PacNMDName = M.getOrInsertNamedMetadata(mdName.str() + "name"); @@ -99,30 +100,31 @@ void PacDfiCreateMetaData(std::map> &fieldI std::vector PacFields; std::vector PacFieldsName; auto styName = RecordDecl2StructName.find(item.first)->second; - PacFields.push_back(llvm::MDString::get(VMContext, styName)); - PacFieldsName.push_back(llvm::MDString::get(VMContext, styName)); + 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(VMContext, Field->getName())); - unsigned idx = CodeGen::getLLVMFieldNumber(*CGM, item.first, Field); + 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(VMContext), idx))); + llvm::Type::getInt32Ty(M.getContext()), idx))); } - PacNMD->addOperand(llvm::MDNode::get(VMContext, PacFields)); - PacNMDName->addOperand(llvm::MDNode::get(VMContext, PacFieldsName)); + PacNMD->addOperand(llvm::MDNode::get(M.getContext(), PacFields)); + PacNMDName->addOperand(llvm::MDNode::get(M.getContext(), PacFieldsName)); } } -void PacDfiEmitStructFieldsMetadata(llvm::Module &M, llvm::LLVMContext &VMContext, CodeGen::CodeGenModule *CGM) +void PacDfiEmitStructFieldsMetadata(llvm::Module &M, CodeGen::CodeGenModule *CGM, + std::function func) { if (!llvm::PARTS::useDataFieldTag()) { return; } // emit struct fields that need to protect with PA if (!PacFieldNameInfos.empty()) { - PacDfiCreateMetaData(PacFieldNameInfos, "pa_field_info", M, VMContext, CGM); + PacDfiCreateMetaData(PacFieldNameInfos, "pa_field_info", M, CGM, func); } if (!PacPtrNameInfos.empty()) { - PacDfiCreateMetaData(PacPtrNameInfos, "pa_ptr_field_info", M, VMContext, CGM); + PacDfiCreateMetaData(PacPtrNameInfos, "pa_ptr_field_info", M, CGM, func); } }