llvm_c_ext: Added `LLVMPrintMetadataToString()`
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 30 Aug 2016 12:29:23 +0100
changeset 77 67e1328d58c9
parent 76 a1cd10a34b21
child 78 7a4c769a9fea
llvm_c_ext: Added `LLVMPrintMetadataToString()` ...and corresponding Smalltalk API. Useful for debugging.
LLVMCEXT.st
LLVMMetadata.st
LLVMTypeFloat.st
llvm_c_ext/include/llvm-c-ext/CoreExt.h
llvm_c_ext/lib/CoreExt.cpp
--- a/LLVMCEXT.st	Fri Aug 26 21:50:03 2016 +0100
+++ b/LLVMCEXT.st	Tue Aug 30 12:29:23 2016 +0100
@@ -561,6 +561,17 @@
     self primitiveFailed
 !
 
+PrintMetadataToString: MD
+    "@param MD: LLVMMetadataRef
+     @return: *void
+    "
+
+    <cdecl: pointer "LLVMPrintMetadataToString" ( LLVMMetadata ) >
+    self primitiveFailed
+
+    "Created: / 30-08-2016 / 12:23:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 RemoveFunctionAttr2: Fn _: PA 
     "@param Fn: LLVMValueRef
      @param PA: uint64_t
--- a/LLVMMetadata.st	Fri Aug 26 21:50:03 2016 +0100
+++ b/LLVMMetadata.st	Tue Aug 30 12:29:23 2016 +0100
@@ -62,44 +62,34 @@
     "Created: / 14-08-2015 / 16:35:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!LLVMMetadata methodsFor:'printing & storing'!
+!LLVMMetadata methodsFor:'debugging-dumping'!
+
+dumpOn: aStream
+    aStream nextPutAll: self dumpString
 
-printOn:aStream
-    | kind |
+    "Created: / 10-07-2015 / 14:32:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
 
-    kind := self kind.
+dumpString
+    | cstr str|
 
-    MDTupleKind == kind ifTrue:[ aStream nextPutAll:'MDTuple'].
-    DILocationKind == kind ifTrue:[ aStream nextPutAll:'DILocation'].
-    GenericDINodeKind == kind ifTrue:[ aStream nextPutAll:'GenericDINode'].
-    DISubrangeKind == kind ifTrue:[ aStream nextPutAll:'DISubrange'].
-    DIEnumeratorKind == kind ifTrue:[ aStream nextPutAll:'DIEnumerator'].
-    DIBasicTypeKind == kind ifTrue:[ aStream nextPutAll:'DIBasicType'].
-    DIDerivedTypeKind == kind ifTrue:[ aStream nextPutAll:'DIDerivedType'].
-    DICompositeTypeKind == kind ifTrue:[ aStream nextPutAll:'DICompositeType'].
-    DISubroutineTypeKind == kind ifTrue:[ aStream nextPutAll:'DISubroutineType'].
-    DIFileKind == kind ifTrue:[ aStream nextPutAll:'DIFile'].
-    DICompileUnitKind == kind ifTrue:[ aStream nextPutAll:'DICompileUnit'].
-    DISubprogramKind == kind ifTrue:[ aStream nextPutAll:'DISubprogram'].
-    DILexicalBlockKind == kind ifTrue:[ aStream nextPutAll:'DILexicalBlock'].
-    DILexicalBlockFileKind == kind ifTrue:[ aStream nextPutAll:'DILexicalBlockFile'].
-    DINamespaceKind == kind ifTrue:[ aStream nextPutAll:'DINamespace'].
-    DIModuleKind == kind ifTrue:[ aStream nextPutAll:'DIModule'].
-    DITemplateTypeParameterKind == kind ifTrue:[ aStream nextPutAll:'DITemplateTypeParameter'].
-    DITemplateValueParameterKind == kind ifTrue:[ aStream nextPutAll:'DITemplateValueParameter'].
-    DIGlobalVariableKind == kind ifTrue:[ aStream nextPutAll:'DIGlobalVariable'].
-    DILocalVariableKind == kind ifTrue:[ aStream nextPutAll:'DILocalVariable'].
-    DIExpressionKind == kind ifTrue:[ aStream nextPutAll:'DIExpression'].
-    DIObjCPropertyKind == kind ifTrue:[ aStream nextPutAll:'DIObjCProperty'].
-    DIImportedEntityKind == kind ifTrue:[ aStream nextPutAll:'DIImportedEntity'].
-    ConstantAsMetadataKind == kind ifTrue:[ aStream nextPutAll:'ConstantAsMetadata'].
-    LocalAsMetadataKind == kind ifTrue:[ aStream nextPutAll:'LocalAsMetadata'].
-    MDStringKind == kind ifTrue:[ aStream nextPutAll:'MDString'].
+    cstr := LLVMCEXT PrintMetadataToString: self.
+    str := cstr copyCStringFromHeap.
+    LLVM DisposeMessage: cstr.
+    ^ str
+
+    "Created: / 10-07-2015 / 14:31:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 30-08-2016 / 12:24:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
 
-    aStream nextPutAll:'@'.
-    self address printOn:aStream base:16.
+printOn: aStream
+    super printOn: aStream.
+    aStream nextPut: $(.
+    aStream nextPutAll: self dumpString.
+    aStream nextPut: $)
 
-    "Created: / 23-08-2016 / 23:29:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 11-07-2015 / 07:09:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 30-08-2016 / 12:24:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !LLVMMetadata methodsFor:'testing'!
--- a/LLVMTypeFloat.st	Fri Aug 26 21:50:03 2016 +0100
+++ b/LLVMTypeFloat.st	Tue Aug 30 12:29:23 2016 +0100
@@ -48,3 +48,10 @@
     "Created: / 13-08-2015 / 16:51:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
+!LLVMTypeFloat class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- a/llvm_c_ext/include/llvm-c-ext/CoreExt.h	Fri Aug 26 21:50:03 2016 +0100
+++ b/llvm_c_ext/include/llvm-c-ext/CoreExt.h	Tue Aug 30 12:29:23 2016 +0100
@@ -61,6 +61,15 @@
 
 void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New);
 
+/**
+ * Return a user-friendly representation of the metadata node.
+ * Usefull mainly for debugging. 
+ *
+ * \return string representation of the metadata. The caller is
+ *         responsible for free()ing the string
+ */
+char* LLVMPrintMetadataToString(LLVMMetadataRef MD);
+
 
 /**
  * Set the current source location in the original source. This information
--- a/llvm_c_ext/lib/CoreExt.cpp	Fri Aug 26 21:50:03 2016 +0100
+++ b/llvm_c_ext/lib/CoreExt.cpp	Tue Aug 30 12:29:23 2016 +0100
@@ -102,6 +102,18 @@
   MDNode::deleteTemporary(Node);
 }
 
+char* LLVMPrintMetadataToString(LLVMMetadataRef MD) {
+    std::string buf;
+    raw_string_ostream os(buf);
+ 
+    if (unwrap(MD))
+        unwrap(MD)->print(os);
+    else
+         os << "Printing <null> Metadata";
+    os.flush();
+    return strdup(buf.c_str());
+}
+
 void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
                                   unsigned Col, LLVMMetadataRef Scope,
                                   LLVMMetadataRef InlinedAt) {