summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2019-01-18 02:47:48 +0000
committerThomas Lively <tlively@google.com>2019-01-18 02:47:48 +0000
commitc6795e07f03ddc8a9ab3e7dd86da713a7a8003c5 (patch)
tree8a3792b72f82ef45180c7a00ee8f4b4bdf84903c /llvm/lib
parentf5ce42c040c5f3f3025e0665cdb5c7d8c8659462 (diff)
downloadbcm5719-llvm-c6795e07f03ddc8a9ab3e7dd86da713a7a8003c5.tar.gz
bcm5719-llvm-c6795e07f03ddc8a9ab3e7dd86da713a7a8003c5.zip
[WebAssembly] Add languages from debug info to producers section
Reviewers: aheejin, dschuff, sbc100 Subscribers: aprantl, jgravelle-google, hiraditya, sunfish Differential Revision: https://reviews.llvm.org/D56889 llvm-svn: 351507
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/WebAssembly/LLVMBuild.txt2
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp51
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h1
3 files changed, 40 insertions, 14 deletions
diff --git a/llvm/lib/Target/WebAssembly/LLVMBuild.txt b/llvm/lib/Target/WebAssembly/LLVMBuild.txt
index 055c32bf0cb..a5ad42fd3d0 100644
--- a/llvm/lib/Target/WebAssembly/LLVMBuild.txt
+++ b/llvm/lib/Target/WebAssembly/LLVMBuild.txt
@@ -30,5 +30,5 @@ has_disassembler = 1
type = Library
name = WebAssemblyCodeGen
parent = WebAssembly
-required_libraries = Analysis AsmPrinter CodeGen Core MC Scalar SelectionDAG Support Target TransformUtils WebAssemblyAsmPrinter WebAssemblyDesc WebAssemblyInfo
+required_libraries = Analysis AsmPrinter BinaryFormat CodeGen Core MC Scalar SelectionDAG Support Target TransformUtils WebAssemblyAsmPrinter WebAssemblyDesc WebAssemblyInfo
add_to_library_groups = WebAssembly
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 6d5647a7ace..4d1c28f85d1 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -30,6 +30,7 @@
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
#include "llvm/IR/DataLayout.h"
+#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCSectionWasm.h"
@@ -148,31 +149,55 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) {
}
}
+ EmitProducerInfo(M);
+}
+
+void WebAssemblyAsmPrinter::EmitProducerInfo(Module &M) {
+ llvm::SmallVector<std::pair<std::string, std::string>, 4> Languages;
+ if (const NamedMDNode *Debug = M.getNamedMetadata("llvm.dbg.cu")) {
+ llvm::SmallSet<StringRef, 4> SeenLanguages;
+ for (size_t i = 0, e = Debug->getNumOperands(); i < e; ++i) {
+ const auto *CU = cast<DICompileUnit>(Debug->getOperand(i));
+ StringRef Language = dwarf::LanguageString(CU->getSourceLanguage());
+ Language.consume_front("DW_LANG_");
+ if (SeenLanguages.insert(Language).second)
+ Languages.emplace_back(Language.str(), "");
+ }
+ }
+
+ llvm::SmallVector<std::pair<std::string, std::string>, 4> Tools;
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);
+ if (SeenTools.insert(Name).second)
+ Tools.emplace_back(Name.str(), Version.str());
}
+ }
+
+ int FieldCount = int(!Languages.empty()) + int(!Tools.empty());
+ if (FieldCount != 0) {
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->EmitULEB128IntValue(FieldCount);
+ for (auto &Producers : {std::make_pair("language", &Languages),
+ std::make_pair("processed-by", &Tools)}) {
+ if (Producers.second->empty())
+ continue;
+ OutStreamer->EmitULEB128IntValue(strlen(Producers.first));
+ OutStreamer->EmitBytes(Producers.first);
+ OutStreamer->EmitULEB128IntValue(Producers.second->size());
+ for (auto &Producer : *Producers.second) {
+ OutStreamer->EmitULEB128IntValue(Producer.first.size());
+ OutStreamer->EmitBytes(Producer.first);
+ OutStreamer->EmitULEB128IntValue(Producer.second.size());
+ OutStreamer->EmitBytes(Producer.second);
+ }
}
OutStreamer->PopSection();
}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
index f6cb5610bad..5f6ef4d779b 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
@@ -59,6 +59,7 @@ public:
//===------------------------------------------------------------------===//
void EmitEndOfAsmFile(Module &M) override;
+ void EmitProducerInfo(Module &M);
void EmitJumpTableInfo() override;
void EmitConstantPool() override;
void EmitFunctionBodyStart() override;
OpenPOWER on IntegriCloud