diff options
author | Justin Bogner <mail@justinbogner.com> | 2023-08-15 21:42:48 -0700 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2023-08-15 21:49:28 -0700 |
commit | a1c447d9ddcdc00a6da9c8147626c1013d60315d (patch) | |
tree | 915cd9c1f381bbeee9e2e1e9acd3a73225079f35 /llvm/lib/IR/Core.cpp | |
parent | e17667b33f1f37354a19be6b09d6812a61a66e2a (diff) | |
download | llvm-a1c447d9ddcdc00a6da9c8147626c1013d60315d.zip llvm-a1c447d9ddcdc00a6da9c8147626c1013d60315d.tar.gz llvm-a1c447d9ddcdc00a6da9c8147626c1013d60315d.tar.bz2 |
[C API]: Add getters for inline assembly template string, constraints, and flags
This change adds support for accessing information about inline
assembly calls through the C API, enough to be able to round-trip the
information. This partially addresses https://llvm.org/pr42692 which
points out gaps in the C API
Getters for each of the parameters to LLVMGetInlineAsm/InlineAsm::get
have been added, such that the C API now has enough surface to clone
inline assembly calls
This API currently only returns the raw constraint string via
LLVMGetInlineAsmConstraintString: it may be prudent to also expose the
parsed constraints via InlineAsm::ParseConstraints, but I wasn't sure
how that should look like. This at least exposes the information for
clients
Patch by Benji Smith. Thanks!
Differential Revision: https://reviews.llvm.org/D153185
Diffstat (limited to 'llvm/lib/IR/Core.cpp')
-rw-r--r-- | llvm/lib/IR/Core.cpp | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index 129e91b..207d57e 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -460,8 +460,8 @@ const char *LLVMGetModuleInlineAsm(LLVMModuleRef M, size_t *Len) { return Str.c_str(); } -LLVMValueRef LLVMGetInlineAsm(LLVMTypeRef Ty, char *AsmString, - size_t AsmStringSize, char *Constraints, +LLVMValueRef LLVMGetInlineAsm(LLVMTypeRef Ty, const char *AsmString, + size_t AsmStringSize, const char *Constraints, size_t ConstraintsSize, LLVMBool HasSideEffects, LLVMBool IsAlignStack, LLVMInlineAsmDialect Dialect, LLVMBool CanThrow) { @@ -480,6 +480,61 @@ LLVMValueRef LLVMGetInlineAsm(LLVMTypeRef Ty, char *AsmString, HasSideEffects, IsAlignStack, AD, CanThrow)); } +const char *LLVMGetInlineAsmAsmString(LLVMValueRef InlineAsmVal, size_t *Len) { + + Value *Val = unwrap<Value>(InlineAsmVal); + const std::string &AsmString = cast<InlineAsm>(Val)->getAsmString(); + + *Len = AsmString.length(); + return AsmString.c_str(); +} + +const char *LLVMGetInlineAsmConstraintString(LLVMValueRef InlineAsmVal, + size_t *Len) { + Value *Val = unwrap<Value>(InlineAsmVal); + const std::string &ConstraintString = + cast<InlineAsm>(Val)->getConstraintString(); + + *Len = ConstraintString.length(); + return ConstraintString.c_str(); +} + +LLVMInlineAsmDialect LLVMGetInlineAsmDialect(LLVMValueRef InlineAsmVal) { + + Value *Val = unwrap<Value>(InlineAsmVal); + InlineAsm::AsmDialect Dialect = cast<InlineAsm>(Val)->getDialect(); + + switch (Dialect) { + case InlineAsm::AD_ATT: + return LLVMInlineAsmDialectATT; + case InlineAsm::AD_Intel: + return LLVMInlineAsmDialectIntel; + } + + llvm_unreachable("Unrecognized inline assembly dialect"); + return LLVMInlineAsmDialectATT; +} + +LLVMTypeRef LLVMGetInlineAsmFunctionType(LLVMValueRef InlineAsmVal) { + Value *Val = unwrap<Value>(InlineAsmVal); + return (LLVMTypeRef)cast<InlineAsm>(Val)->getFunctionType(); +} + +LLVMBool LLVMGetInlineAsmHasSideEffects(LLVMValueRef InlineAsmVal) { + Value *Val = unwrap<Value>(InlineAsmVal); + return cast<InlineAsm>(Val)->hasSideEffects(); +} + +LLVMBool LLVMGetInlineAsmNeedsAlignedStack(LLVMValueRef InlineAsmVal) { + Value *Val = unwrap<Value>(InlineAsmVal); + return cast<InlineAsm>(Val)->isAlignStack(); +} + +LLVMBool LLVMGetInlineAsmCanUnwind(LLVMValueRef InlineAsmVal) { + Value *Val = unwrap<Value>(InlineAsmVal); + return cast<InlineAsm>(Val)->canThrow(); +} + /*--.. Operations on module contexts ......................................--*/ LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M) { return wrap(&unwrap(M)->getContext()); |