diff options
author | Tyker <tyker1@outlook.com> | 2020-10-26 09:58:20 +0100 |
---|---|---|
committer | Tyker <tyker1@outlook.com> | 2020-10-26 10:50:05 +0100 |
commit | d3205bbca3e0002d76282878986993e7e7994779 (patch) | |
tree | 9b4e41ff8ae3240d34d0b1a4d85266904ded8ef2 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 8aa60f67dc8c67390680b7a3be0d31384300f09f (diff) | |
download | llvm-d3205bbca3e0002d76282878986993e7e7994779.zip llvm-d3205bbca3e0002d76282878986993e7e7994779.tar.gz llvm-d3205bbca3e0002d76282878986993e7e7994779.tar.bz2 |
[Annotation] Allows annotation to carry some additional constant arguments.
This allows using annotation in a much more contexts than it currently has.
especially when annotation with template or constexpr.
Reviewed By: aaron.ballman
Differential Revision: https://reviews.llvm.org/D88645
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index a1511e0..fd13321 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2341,13 +2341,48 @@ llvm::Constant *CodeGenModule::EmitAnnotationLineNo(SourceLocation L) { return llvm::ConstantInt::get(Int32Ty, LineNo); } +llvm::Constant *CodeGenModule::EmitAnnotationArgs(const AnnotateAttr *Attr) { + ArrayRef<Expr *> Exprs = {Attr->args_begin(), Attr->args_size()}; + Exprs = Exprs.drop_front(); + if (Exprs.empty()) + return llvm::ConstantPointerNull::get(Int8PtrTy); + + llvm::FoldingSetNodeID ID; + for (Expr *E : Exprs) { + ID.Add(cast<clang::ConstantExpr>(E)->getAPValueResult()); + } + llvm::Constant *&Lookup = AnnotationArgs[ID.ComputeHash()]; + if (Lookup) + return Lookup; + + llvm::SmallVector<llvm::Constant *, 4> LLVMArgs; + LLVMArgs.reserve(Exprs.size()); + ConstantEmitter ConstEmiter(*this); + llvm::transform(Exprs, std::back_inserter(LLVMArgs), [&](const Expr *E) { + const auto *CE = cast<clang::ConstantExpr>(E); + return ConstEmiter.emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), + CE->getType()); + }); + auto *Struct = llvm::ConstantStruct::getAnon(LLVMArgs); + auto *GV = new llvm::GlobalVariable(getModule(), Struct->getType(), true, + llvm::GlobalValue::PrivateLinkage, Struct, + ".args"); + GV->setSection(AnnotationSection); + GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); + auto *Bitcasted = llvm::ConstantExpr::getBitCast(GV, Int8PtrTy); + + Lookup = Bitcasted; + return Bitcasted; +} + llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, const AnnotateAttr *AA, SourceLocation L) { // Get the globals for file name, annotation, and the line number. llvm::Constant *AnnoGV = EmitAnnotationString(AA->getAnnotation()), *UnitGV = EmitAnnotationUnit(L), - *LineNoCst = EmitAnnotationLineNo(L); + *LineNoCst = EmitAnnotationLineNo(L), + *Args = EmitAnnotationArgs(AA); llvm::Constant *ASZeroGV = GV; if (GV->getAddressSpace() != 0) { @@ -2356,11 +2391,12 @@ llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV, } // Create the ConstantStruct for the global annotation. - llvm::Constant *Fields[4] = { - llvm::ConstantExpr::getBitCast(ASZeroGV, Int8PtrTy), - llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), - llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), - LineNoCst + llvm::Constant *Fields[] = { + llvm::ConstantExpr::getBitCast(ASZeroGV, Int8PtrTy), + llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), + llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), + LineNoCst, + Args, }; return llvm::ConstantStruct::getAnon(Fields); } |