diff options
author | Amaury Sechet <deadalnix@gmail.com> | 2016-06-15 05:14:29 +0000 |
---|---|---|
committer | Amaury Sechet <deadalnix@gmail.com> | 2016-06-15 05:14:29 +0000 |
commit | a65a237805d8c5a995bb15ed31bdeacbab401489 (patch) | |
tree | 95147eef29f4ad6207378b24ac627f534326f39b /llvm/tools/llvm-c-test/echo.cpp | |
parent | 0e392d5dd7fbc70d90cb11525aceaa2977d63583 (diff) | |
download | bcm5719-llvm-a65a237805d8c5a995bb15ed31bdeacbab401489.tar.gz bcm5719-llvm-a65a237805d8c5a995bb15ed31bdeacbab401489.zip |
Add support for callsite in the new C API for attributes
Summary: The second consumer of attributes.
Reviewers: Wallbraker, whitequark, echristo, rafael, jyknight
Subscribers: mehdi_amini
Differential Revision: http://reviews.llvm.org/D21266
llvm-svn: 272754
Diffstat (limited to 'llvm/tools/llvm-c-test/echo.cpp')
-rw-r--r-- | llvm/tools/llvm-c-test/echo.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index 73444b46d93..72ff138c74e 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -375,6 +375,20 @@ struct FunCloner { return Dst; } + void CloneAttrs(LLVMValueRef Src, LLVMValueRef Dst) { + auto Ctx = LLVMGetModuleContext(M); + int ArgCount = LLVMGetNumArgOperands(Src); + for (int i = LLVMAttributeReturnIndex; i <= ArgCount; i++) { + for (unsigned k = 0, e = LLVMGetLastEnumAttributeKind(); k < e; ++k) { + if (auto SrcA = LLVMGetCallSiteEnumAttribute(Src, i, k)) { + auto Val = LLVMGetEnumAttributeValue(SrcA); + auto A = LLVMCreateEnumAttribute(Ctx, k, Val); + LLVMAddCallSiteAttribute(Dst, i, A); + } + } + } + } + LLVMValueRef CloneInstruction(LLVMValueRef Src, LLVMBuilderRef Builder) { check_value_kind(Src, LLVMInstructionValueKind); if (!LLVMIsAInstruction(Src)) @@ -439,6 +453,7 @@ struct FunCloner { LLVMBasicBlockRef Unwind = DeclareBB(LLVMGetUnwindDest(Src)); Dst = LLVMBuildInvoke(Builder, Fn, Args.data(), ArgCount, Then, Unwind, Name); + CloneAttrs(Src, Dst); break; } case LLVMUnreachable: @@ -599,6 +614,7 @@ struct FunCloner { LLVMValueRef Fn = CloneValue(LLVMGetCalledValue(Src)); Dst = LLVMBuildCall(Builder, Fn, Args.data(), ArgCount, Name); LLVMSetTailCall(Dst, LLVMIsTailCall(Src)); + CloneAttrs(Src, Dst); break; } case LLVMResume: { |