PATCH: C API - Add LLVMAddTargetDependentFunctionAttr(), LLVMGetBufferStart(), LLVMGetBufferSize(), LLVMTargetMachineEmitToMemoryBuffer()

Tom Stellard tom at stellard.net
Wed Apr 3 10:44:16 PDT 2013


Hi,

The attached patches add some new functions to the C API.  Please
review.

Thanks,
Tom Stellard

-------------- next part --------------
>From 194f0ae6541e6da2ac1e012439d4452f3673039f Mon Sep 17 00:00:00 2001
From: Tom Stellard <thomas.stellard at amd.com>
Date: Tue, 2 Apr 2013 11:14:51 -0700
Subject: [PATCH 1/4] C API: Add LLVMAddTargetDependentFunctionAttr()

---
 include/llvm-c/Core.h |  7 +++++++
 lib/IR/Core.cpp       | 11 +++++++++++
 2 files changed, 18 insertions(+)

diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h
index e85fb97..9c1d825 100644
--- a/include/llvm-c/Core.h
+++ b/include/llvm-c/Core.h
@@ -1694,6 +1694,13 @@ void LLVMSetGC(LLVMValueRef Fn, const char *Name);
 void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
 
 /**
+ * Add a target-dependent attribute to a fuction
+ * @see llvm::AttrBuilder::addAttribute()
+ */
+void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A,
+                                        const char *V);
+
+/**
  * Obtain an attribute from a function.
  *
  * @see llvm::Function::getAttributes()
diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp
index 983b49c..df23833 100644
--- a/lib/IR/Core.cpp
+++ b/lib/IR/Core.cpp
@@ -1396,6 +1396,17 @@ void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
   Func->setAttributes(PALnew);
 }
 
+void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A,
+                                        const char *V) {
+  Function *Func = unwrap<Function>(Fn);
+  int Idx = AttributeSet::FunctionIndex;
+  AttrBuilder B;
+
+  B.addAttribute(A, V);
+  AttributeSet Set = AttributeSet::get(Func->getContext(), Idx, B);
+  Func->addAttributes(Idx, Set);
+}
+
 void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
   Function *Func = unwrap<Function>(Fn);
   const AttributeSet PAL = Func->getAttributes();
-- 
1.7.11.4

-------------- next part --------------
>From 54b5515729aaa484f1a920289d13d117616cf963 Mon Sep 17 00:00:00 2001
From: Tom Stellard <thomas.stellard at amd.com>
Date: Tue, 2 Apr 2013 11:16:08 -0700
Subject: [PATCH 2/4] C API: Add LLVMGetBufferStart()

---
 include/llvm-c/Core.h | 1 +
 lib/IR/Core.cpp       | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h
index 9c1d825..3b350e4 100644
--- a/include/llvm-c/Core.h
+++ b/include/llvm-c/Core.h
@@ -2567,6 +2567,7 @@ LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRange(const char *InputData,
 LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRangeCopy(const char *InputData,
                                                               size_t InputDataLength,
                                                               const char *BufferName);
+const char* LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf);
 void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
 
 /**
diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp
index df23833..0b13be3 100644
--- a/lib/IR/Core.cpp
+++ b/lib/IR/Core.cpp
@@ -2408,6 +2408,9 @@ LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRangeCopy(
       StringRef(BufferName)));
 }
 
+const char* LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf) {
+  return unwrap(MemBuf)->getBufferStart();
+}
 
 void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
   delete unwrap(MemBuf);
-- 
1.7.11.4

-------------- next part --------------
>From 32ec728e801bc40b52659ea9872cb22ca22b8e2d Mon Sep 17 00:00:00 2001
From: Tom Stellard <thomas.stellard at amd.com>
Date: Tue, 2 Apr 2013 11:16:30 -0700
Subject: [PATCH 3/4] C API: Add LLVMGetBufferSize()

---
 include/llvm-c/Core.h | 1 +
 lib/IR/Core.cpp       | 4 ++++
 2 files changed, 5 insertions(+)

diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h
index 3b350e4..2ef0af5 100644
--- a/include/llvm-c/Core.h
+++ b/include/llvm-c/Core.h
@@ -2568,6 +2568,7 @@ LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRangeCopy(const char *InputD
                                                               size_t InputDataLength,
                                                               const char *BufferName);
 const char* LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf);
+size_t LLVMGetBufferSize(LLVMMemoryBufferRef MemBuf);
 void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
 
 /**
diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp
index 0b13be3..5777e9e 100644
--- a/lib/IR/Core.cpp
+++ b/lib/IR/Core.cpp
@@ -2412,6 +2412,10 @@ const char* LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf) {
   return unwrap(MemBuf)->getBufferStart();
 }
 
+size_t LLVMGetBufferSize(LLVMMemoryBufferRef MemBuf) {
+  return unwrap(MemBuf)->getBufferSize();
+}
+
 void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
   delete unwrap(MemBuf);
 }
-- 
1.7.11.4

-------------- next part --------------
>From 231f0afbcabe7db04a600d322af3607a44472262 Mon Sep 17 00:00:00 2001
From: Tom Stellard <thomas.stellard at amd.com>
Date: Tue, 2 Apr 2013 11:17:00 -0700
Subject: [PATCH 4/4] C API: Add LLVMTargetMachineEmitToMemoryBuffer()

---
 include/llvm-c/TargetMachine.h |  3 +++
 lib/Target/TargetMachineC.cpp  | 45 +++++++++++++++++++++++++++++++-----------
 2 files changed, 36 insertions(+), 12 deletions(-)

diff --git a/include/llvm-c/TargetMachine.h b/include/llvm-c/TargetMachine.h
index 691abdf..a02161a 100644
--- a/include/llvm-c/TargetMachine.h
+++ b/include/llvm-c/TargetMachine.h
@@ -114,6 +114,9 @@ LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T);
 LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
   char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage);
 
+/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */
+LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M,
+  LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf);
 
 
 
diff --git a/lib/Target/TargetMachineC.cpp b/lib/Target/TargetMachineC.cpp
index 79f74bd..11a5d7a 100644
--- a/lib/Target/TargetMachineC.cpp
+++ b/lib/Target/TargetMachineC.cpp
@@ -149,8 +149,8 @@ LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T) {
   return wrap(unwrap(T)->getDataLayout());
 }
 
-LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
-  char* Filename, LLVMCodeGenFileType codegen, char** ErrorMessage) {
+static LLVMBool LLVMTargetMachineEmit(LLVMTargetMachineRef T, LLVMModuleRef M,
+  formatted_raw_ostream &OS, LLVMCodeGenFileType codegen, char **ErrorMessage) {
   TargetMachine* TM = unwrap(T);
   Module* Mod = unwrap(M);
 
@@ -176,14 +176,7 @@ LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
       ft = TargetMachine::CGFT_ObjectFile;
       break;
   }
-  raw_fd_ostream dest(Filename, error, raw_fd_ostream::F_Binary);
-  formatted_raw_ostream destf(dest);
-  if (!error.empty()) {
-    *ErrorMessage = strdup(error.c_str());
-    return true;
-  }
-
-  if (TM->addPassesToEmitFile(pass, destf, ft)) {
+  if (TM->addPassesToEmitFile(pass, OS, ft)) {
     error = "TargetMachine can't emit a file of this type";
     *ErrorMessage = strdup(error.c_str());
     return true;
@@ -191,7 +184,35 @@ LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
 
   pass.run(*Mod);
 
-  destf.flush();
-  dest.flush();
+  OS.flush();
   return false;
 }
+
+LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M,
+  char* Filename, LLVMCodeGenFileType codegen, char** ErrorMessage) {
+  std::string error;
+  raw_fd_ostream dest(Filename, error, raw_fd_ostream::F_Binary);
+  formatted_raw_ostream destf(dest);
+  if (!error.empty()) {
+    *ErrorMessage = strdup(error.c_str());
+    return true;
+  }
+  bool Result = LLVMTargetMachineEmit(T, M, destf, codegen, ErrorMessage);
+  dest.flush();
+  return Result;
+}
+
+LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T,
+  LLVMModuleRef M, LLVMCodeGenFileType codegen, char** ErrorMessage,
+  LLVMMemoryBufferRef *OutMemBuf) {
+  std::string CodeString;
+  raw_string_ostream OStream(CodeString);
+  formatted_raw_ostream Out(OStream);
+  bool Result = LLVMTargetMachineEmit(T, M, Out, codegen, ErrorMessage);
+  OStream.flush();
+
+  std::string &Data = OStream.str();
+  *OutMemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(Data.c_str(),
+                                                     Data.length(), "");
+  return Result;
+}
-- 
1.7.11.4



More information about the llvm-commits mailing list