dd6029ff3a
There are several bugfixes in this update, but the most important one is to ensure __start_ and __stop_ symbols for linker sets and kernel module metadata are always emitted in object files: http://llvm.org/bugs/show_bug.cgi?id=9292 Before this fix, if you compiled kernel modules with clang, they would not be properly processed by kldxref, and if they had any dependencies, the kernel would fail to load those. Another problem occurred when attempting to mount a tmpfs filesystem, which would result in 'operation not supported by device'.
56 lines
1.8 KiB
C++
56 lines
1.8 KiB
C++
//===- AsmWriterEmitter.h - Generate an assembly writer ---------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This tablegen backend is responsible for emitting an assembly printer for the
|
|
// code generator.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef ASMWRITER_EMITTER_H
|
|
#define ASMWRITER_EMITTER_H
|
|
|
|
#include "TableGenBackend.h"
|
|
#include <map>
|
|
#include <vector>
|
|
#include <cassert>
|
|
|
|
namespace llvm {
|
|
class AsmWriterInst;
|
|
class CodeGenInstruction;
|
|
|
|
class AsmWriterEmitter : public TableGenBackend {
|
|
RecordKeeper &Records;
|
|
std::map<const CodeGenInstruction*, AsmWriterInst*> CGIAWIMap;
|
|
std::vector<const CodeGenInstruction*> NumberedInstructions;
|
|
public:
|
|
AsmWriterEmitter(RecordKeeper &R) : Records(R) {}
|
|
|
|
// run - Output the asmwriter, returning true on failure.
|
|
void run(raw_ostream &o);
|
|
|
|
private:
|
|
void EmitPrintInstruction(raw_ostream &o);
|
|
void EmitGetRegisterName(raw_ostream &o);
|
|
void EmitGetInstructionName(raw_ostream &o);
|
|
void EmitPrintAliasInstruction(raw_ostream &O);
|
|
|
|
AsmWriterInst *getAsmWriterInstByID(unsigned ID) const {
|
|
assert(ID < NumberedInstructions.size());
|
|
std::map<const CodeGenInstruction*, AsmWriterInst*>::const_iterator I =
|
|
CGIAWIMap.find(NumberedInstructions[ID]);
|
|
assert(I != CGIAWIMap.end() && "Didn't find inst!");
|
|
return I->second;
|
|
}
|
|
void FindUniqueOperandCommands(std::vector<std::string> &UOC,
|
|
std::vector<unsigned> &InstIdxs,
|
|
std::vector<unsigned> &InstOpsUsed) const;
|
|
};
|
|
}
|
|
#endif
|