From 66779995bdd8b52605a185aaa8752d4a3339f514 Mon Sep 17 00:00:00 2001 From: baojingjing Date: Mon, 26 Jun 2023 10:35:27 +0800 Subject: [PATCH 1/2] [clang] add DFI struct field name metadata MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 描述: 新增field name metadat Issue: #I7FXF4:为DFI新增field name metadata 测试: Signed-off-by: baojingjing --- clang/include/clang/Pac/PacDfi.h | 1 - clang/lib/Pac/PacDfi.cpp | 5 +++++ clang/lib/Parse/ParseExpr.cpp | 5 +++-- .../Target/AArch64/AArch64PARTS/AArch64EarlyPartsCpiPass.cpp | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/clang/include/clang/Pac/PacDfi.h b/clang/include/clang/Pac/PacDfi.h index 0d028417cdcc..920cfffc87b8 100644 --- a/clang/include/clang/Pac/PacDfi.h +++ b/clang/include/clang/Pac/PacDfi.h @@ -23,6 +23,5 @@ using namespace clang; void PacDfiParseStruct(RecordDecl *TagDecl, ASTContext &Ctx, DiagnosticsEngine &Diags); void PacDfiEmitStructFieldsMetadata(llvm::Module &M, llvm::LLVMContext &VMContext, CodeGen::CodeGenModule *CGM); void PacDfiRecordDecl2StructName(const RecordDecl *RD, llvm::StructType *Entry); - #endif diff --git a/clang/lib/Pac/PacDfi.cpp b/clang/lib/Pac/PacDfi.cpp index 4ab2b19ea069..308d734193fb 100644 --- a/clang/lib/Pac/PacDfi.cpp +++ b/clang/lib/Pac/PacDfi.cpp @@ -91,19 +91,24 @@ void PacDfiCreateMetaData(std::map> &fieldI llvm::Module &M, llvm::LLVMContext &VMContext, CodeGen::CodeGenModule *CGM) { 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; } 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)); for (auto *Field : item.second) { + PacFieldsName.push_back(llvm::MDString::get(VMContext, Field->getName())); unsigned idx = CodeGen::getLLVMFieldNumber(*CGM, item.first, Field); PacFields.push_back(llvm::ConstantAsMetadata::get(llvm::ConstantInt::get( llvm::Type::getInt32Ty(VMContext), idx))); } PacNMD->addOperand(llvm::MDNode::get(VMContext, PacFields)); + PacNMDName->addOperand(llvm::MDNode::get(VMContext, PacFieldsName)); } } diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index 1c0e0c62a3c5..2b506786df77 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -2408,8 +2408,9 @@ ExprResult Parser::ParseSYCLUniqueStableNameExpression() { ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() { assert(Tok.isOneOf(tok::kw_sizeof, tok::kw___alignof, tok::kw_alignof, tok::kw__Alignof, tok::kw_vec_step, - tok::kw___builtin_omp_required_simd_align) && - "Not a sizeof/alignof/vec_step expression!"); + tok::kw___builtin_omp_required_simd_align, + tok::kw___builtin_get_modifier_bytype) && // OHOS_LOCAL + "Not a sizeof/alignof/vec_step/get_modifier_bytype expression!"); Token OpTok = Tok; ConsumeToken(); diff --git a/llvm/lib/Target/AArch64/AArch64PARTS/AArch64EarlyPartsCpiPass.cpp b/llvm/lib/Target/AArch64/AArch64PARTS/AArch64EarlyPartsCpiPass.cpp index 63d38b6729f9..c590344b93bc 100644 --- a/llvm/lib/Target/AArch64/AArch64PARTS/AArch64EarlyPartsCpiPass.cpp +++ b/llvm/lib/Target/AArch64/AArch64PARTS/AArch64EarlyPartsCpiPass.cpp @@ -127,7 +127,7 @@ inline MachineInstr* AArch64EarlyPartsCpiPass::findIndirectCallMachineInstr(Mach unsigned BLRinstr_oper0 = 0; for (auto &MBB: MF) { for (auto MIi = MBB.instr_begin(), MIie = MBB.instr_end(); MIi != MIie; ++MIi) { - if (&*MIi != nullptr && isIndirectCall(*MIi)) { + if (isIndirectCall(*MIi)) { BLRinstr_oper0 = MIi->getOperand(0).getReg(); if (AUTCALLinstr_oper0 == BLRinstr_oper0) { return &*MIi; -- Gitee From adbca1ef307ecdbcff084078f0bfd5112733d57e Mon Sep 17 00:00:00 2001 From: baojingjing Date: Thu, 27 Jul 2023 14:56:26 +0800 Subject: [PATCH 2/2] [OHOS]Fix PacDfi cyclic dependency issue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 描述: PacDfi去除对codeGen的依赖 Issue: #I7L1RP:[R&D][Build] Fix LLVM build with BUILD_SHARED_LIBS=ON 测试: Signed-off-by: baojingjing --- clang/include/clang/Pac/PacDfi.h | 4 +++- clang/lib/CodeGen/CMakeLists.txt | 1 + clang/lib/CodeGen/CodeGenModule.cpp | 2 +- clang/lib/Pac/CMakeLists.txt | 9 +++++++-- clang/lib/Pac/PacDfi.cpp | 24 +++++++++++++----------- llvm/lib/PARTS/CMakeLists.txt | 4 ++-- llvm/lib/Target/AArch64/CMakeLists.txt | 7 +------ 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/clang/include/clang/Pac/PacDfi.h b/clang/include/clang/Pac/PacDfi.h index 920cfffc87b8..c5d0f914a5bc 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 60a45250389d..4e5a61171c9f 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 6e61a85771d4..556621d2061f 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 bc1d3dcffaa0..df6bf817f857 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 - Parts - clangCodeGen + clangAST + clangBasic ) \ No newline at end of file diff --git a/clang/lib/Pac/PacDfi.cpp b/clang/lib/Pac/PacDfi.cpp index 308d734193fb..2a2e502f4e25 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); } } diff --git a/llvm/lib/PARTS/CMakeLists.txt b/llvm/lib/PARTS/CMakeLists.txt index 196de8467f3e..d4b31cf71e3f 100644 --- a/llvm/lib/PARTS/CMakeLists.txt +++ b/llvm/lib/PARTS/CMakeLists.txt @@ -1,4 +1,4 @@ -add_llvm_component_library(Parts +add_llvm_component_library(LLVMParts Parts.cpp PartsPluginPass.cpp @@ -20,4 +20,4 @@ add_llvm_component_library(Parts LLVMTransformUtils LLVMCodeGen ) -set_property(TARGET Parts PROPERTY LLVM_SYSTEM_LIBS) \ No newline at end of file +set_property(TARGET LLVMParts PROPERTY LLVM_SYSTEM_LIBS) \ No newline at end of file diff --git a/llvm/lib/Target/AArch64/CMakeLists.txt b/llvm/lib/Target/AArch64/CMakeLists.txt index 1bc430899572..c507c76907b7 100644 --- a/llvm/lib/Target/AArch64/CMakeLists.txt +++ b/llvm/lib/Target/AArch64/CMakeLists.txt @@ -94,12 +94,6 @@ add_llvm_target(AArch64CodeGen DEPENDS intrinsics_gen - # OHOS_LOCAL start - Parts - - LINK_LIBS - Parts - # OHOS_LOCAL end LINK_COMPONENTS AArch64Desc @@ -117,6 +111,7 @@ add_llvm_target(AArch64CodeGen TransformUtils GlobalISel CFGuard + Parts # OHOS_LOCAL ADD_TO_COMPONENT AArch64 -- Gitee