summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2019-01-17 02:29:55 +0000
committerThomas Lively <tlively@google.com>2019-01-17 02:29:55 +0000
commitcbda16eb8ebf52e10a44bd6f15e2743d69e9632a (patch)
tree43a795712422a63a3f60e732ac9131ceaa0bfd32 /llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
parent2a0868ff48cbf9b3b57858c0f95b89607b69aac9 (diff)
downloadbcm5719-llvm-cbda16eb8ebf52e10a44bd6f15e2743d69e9632a.tar.gz
bcm5719-llvm-cbda16eb8ebf52e10a44bd6f15e2743d69e9632a.zip
[WebAssembly] Parse llvm.ident into producers section
llvm-svn: 351413
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index c4f03dfa7f9..6d5647a7ace 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -22,6 +22,7 @@
#include "WebAssemblyMCInstLower.h"
#include "WebAssemblyMachineFunctionInfo.h"
#include "WebAssemblyRegisterInfo.h"
+#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/CodeGen/Analysis.h"
#include "llvm/CodeGen/AsmPrinter.h"
@@ -146,6 +147,35 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) {
OutStreamer->PopSection();
}
}
+
+ if (const NamedMDNode *Ident = M.getNamedMetadata("llvm.ident")) {
+ llvm::SmallSet<StringRef, 4> SeenTools;
+ llvm::SmallVector<std::pair<StringRef, StringRef>, 4> Tools;
+ for (size_t i = 0, e = Ident->getNumOperands(); i < e; ++i) {
+ const auto *S = cast<MDString>(Ident->getOperand(i)->getOperand(0));
+ std::pair<StringRef, StringRef> Field = S->getString().split("version");
+ StringRef Name = Field.first.trim();
+ StringRef Version = Field.second.trim();
+ if (!SeenTools.insert(Name).second)
+ continue;
+ Tools.emplace_back(Name, Version);
+ }
+ MCSectionWasm *Producers = OutContext.getWasmSection(
+ ".custom_section.producers", SectionKind::getMetadata());
+ OutStreamer->PushSection();
+ OutStreamer->SwitchSection(Producers);
+ OutStreamer->EmitULEB128IntValue(1);
+ OutStreamer->EmitULEB128IntValue(strlen("processed-by"));
+ OutStreamer->EmitBytes("processed-by");
+ OutStreamer->EmitULEB128IntValue(Tools.size());
+ for (auto &Tool : Tools) {
+ OutStreamer->EmitULEB128IntValue(Tool.first.size());
+ OutStreamer->EmitBytes(Tool.first);
+ OutStreamer->EmitULEB128IntValue(Tool.second.size());
+ OutStreamer->EmitBytes(Tool.second);
+ }
+ OutStreamer->PopSection();
+ }
}
void WebAssemblyAsmPrinter::EmitConstantPool() {
OpenPOWER on IntegriCloud