aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Core.cpp
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2023-08-15 21:42:48 -0700
committerJustin Bogner <mail@justinbogner.com>2023-08-15 21:49:28 -0700
commita1c447d9ddcdc00a6da9c8147626c1013d60315d (patch)
tree915cd9c1f381bbeee9e2e1e9acd3a73225079f35 /llvm/lib/IR/Core.cpp
parente17667b33f1f37354a19be6b09d6812a61a66e2a (diff)
downloadllvm-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.cpp59
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());