llvm_c_ext: Added `LLVMPrintMetadataToString()`
...and corresponding Smalltalk API. Useful for debugging.
--- 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) {