summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2008-08-17 13:56:03 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2008-08-17 13:56:03 +0000
commitafbc02ba509be754f8abe3727eb7d1af21a731ba (patch)
tree2a98986a48b125b702d78e5256829fc6cd8775ac /llvm/lib/CodeGen/AsmPrinter
parentb9fc3a26fcc36cf55e795c8afd39ebf67f004753 (diff)
downloadbcm5719-llvm-afbc02ba509be754f8abe3727eb7d1af21a731ba.tar.gz
bcm5719-llvm-afbc02ba509be754f8abe3727eb7d1af21a731ba.zip
Fix merge error
llvm-svn: 54891
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp18
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp (renamed from llvm/lib/CodeGen/AsmPrinter/OcamlGCMetadataPrinter.cpp)64
2 files changed, 35 insertions, 47 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 4d16c7b0f1a..de31840d703 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -122,10 +122,6 @@ bool AsmPrinter::doInitialization(Module &M) {
E = CMM->end(); I != E; ++I)
if (GCMetadataPrinter *GCP = GetOrCreateGCPrinter(*I))
GCP->beginAssembly(O, *this, *TAI);
-<<<<<<< HEAD:lib/CodeGen/AsmPrinter.cpp
-=======
-
->>>>>>> Factor out asmprinters from collector interface.:lib/CodeGen/AsmPrinter.cpp
if (!M.getModuleInlineAsm().empty())
O << TAI->getCommentString() << " Start of file scope inline assembly\n"
@@ -1473,7 +1469,6 @@ void AsmPrinter::printVisibility(const std::string& Name,
GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(Collector *C) {
if (!C->usesMetadata())
return 0;
-<<<<<<< HEAD:lib/CodeGen/AsmPrinter.cpp
gcp_iterator GCPI = GCMetadataPrinters.find(C);
if (GCPI != GCMetadataPrinters.end())
@@ -1481,15 +1476,6 @@ GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(Collector *C) {
const char *Name = C->getName().c_str();
-=======
-
- gcp_iterator GCPI = GCMetadataPrinters.find(C);
- if (GCPI != GCMetadataPrinters.end())
- return GCPI->second;
-
- const char *Name = C->getName().c_str();
-
->>>>>>> Factor out asmprinters from collector interface.:lib/CodeGen/AsmPrinter.cpp
for (GCMetadataPrinterRegistry::iterator
I = GCMetadataPrinterRegistry::begin(),
E = GCMetadataPrinterRegistry::end(); I != E; ++I)
@@ -1499,11 +1485,7 @@ GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(Collector *C) {
GCMetadataPrinters.insert(std::make_pair(C, GCP));
return GCP;
}
-<<<<<<< HEAD:lib/CodeGen/AsmPrinter.cpp
-=======
-
->>>>>>> Factor out asmprinters from collector interface.:lib/CodeGen/AsmPrinter.cpp
cerr << "no GCMetadataPrinter registered for collector: " << Name << "\n";
abort();
}
diff --git a/llvm/lib/CodeGen/AsmPrinter/OcamlGCMetadataPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp
index d1208e2d248..efa7f672769 100644
--- a/llvm/lib/CodeGen/AsmPrinter/OcamlGCMetadataPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/OcamlGCPrinter.cpp
@@ -1,4 +1,4 @@
-//===-- OcamlGCMetadataPrinter.cpp - Ocaml frametable emitter -------------===//
+//===-- OcamlCollector.cpp - Ocaml frametable emitter ---------------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -7,15 +7,14 @@
//
//===----------------------------------------------------------------------===//
//
-// This file implements gc metadata printing for the llvm.gc* intrinsics
-// compatible with Objective Caml 3.10.0, which uses a liveness-accurate static
-// stack map.
+// This file implements lowering for the llvm.gc* intrinsics compatible with
+// Objective Caml 3.10.0, which uses a liveness-accurate static stack map.
//
//===----------------------------------------------------------------------===//
-
+
+#include "llvm/CodeGen/GCs.h"
#include "llvm/CodeGen/AsmPrinter.h"
-#include "llvm/CodeGen/Collectors.h"
-#include "llvm/CodeGen/Collector.h"
+#include "llvm/CodeGen/GCStrategy.h"
#include "llvm/Module.h"
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetData.h"
@@ -24,22 +23,29 @@
using namespace llvm;
namespace {
+
class VISIBILITY_HIDDEN OcamlGCMetadataPrinter : public GCMetadataPrinter {
public:
void beginAssembly(std::ostream &OS, AsmPrinter &AP,
const TargetAsmInfo &TAI);
+
void finishAssembly(std::ostream &OS, AsmPrinter &AP,
const TargetAsmInfo &TAI);
};
+
}
static GCMetadataPrinterRegistry::Add<OcamlGCMetadataPrinter>
-X("ocaml", "ocaml 3.10-compatible collector");
+Y("ocaml", "ocaml 3.10-compatible collector");
+
+GCMetadataPrinter *llvm::createOcamlMetadataPrinter() {
+ return new OcamlGCMetadataPrinter();
+}
static void EmitCamlGlobal(const Module &M, std::ostream &OS, AsmPrinter &AP,
const TargetAsmInfo &TAI, const char *Id) {
const std::string &MId = M.getModuleIdentifier();
-
+
std::string Mangled;
Mangled += TAI.getGlobalPrefix();
Mangled += "caml";
@@ -47,10 +53,10 @@ static void EmitCamlGlobal(const Module &M, std::ostream &OS, AsmPrinter &AP,
Mangled.append(MId.begin(), std::find(MId.begin(), MId.end(), '.'));
Mangled += "__";
Mangled += Id;
-
+
// Capitalize the first letter of the module name.
Mangled[Letter] = toupper(Mangled[Letter]);
-
+
if (const char *GlobalDirective = TAI.getGlobalDirective())
OS << GlobalDirective << Mangled << "\n";
OS << Mangled << ":\n";
@@ -60,13 +66,13 @@ void OcamlGCMetadataPrinter::beginAssembly(std::ostream &OS, AsmPrinter &AP,
const TargetAsmInfo &TAI) {
AP.SwitchToTextSection(TAI.getTextSection());
EmitCamlGlobal(getModule(), OS, AP, TAI, "code_begin");
-
+
AP.SwitchToDataSection(TAI.getDataSection());
EmitCamlGlobal(getModule(), OS, AP, TAI, "data_begin");
}
/// emitAssembly - Print the frametable. The ocaml frametable format is thus:
-///
+///
/// extern "C" struct align(sizeof(intptr_t)) {
/// uint16_t NumDescriptors;
/// struct align(sizeof(intptr_t)) {
@@ -76,11 +82,11 @@ void OcamlGCMetadataPrinter::beginAssembly(std::ostream &OS, AsmPrinter &AP,
/// uint16_t LiveOffsets[NumLiveOffsets];
/// } Descriptors[NumDescriptors];
/// } caml${module}__frametable;
-///
+///
/// Note that this precludes programs from stack frames larger than 64K
/// (FrameSize and LiveOffsets would overflow). FrameTablePrinter will abort if
/// either condition is detected in a function which uses the collector.
-///
+///
void OcamlGCMetadataPrinter::finishAssembly(std::ostream &OS, AsmPrinter &AP,
const TargetAsmInfo &TAI) {
const char *AddressDirective;
@@ -95,25 +101,25 @@ void OcamlGCMetadataPrinter::finishAssembly(std::ostream &OS, AsmPrinter &AP,
AP.SwitchToTextSection(TAI.getTextSection());
EmitCamlGlobal(getModule(), OS, AP, TAI, "code_end");
-
+
AP.SwitchToDataSection(TAI.getDataSection());
EmitCamlGlobal(getModule(), OS, AP, TAI, "data_end");
-
+
OS << AddressDirective << 0; // FIXME: Why does ocaml emit this??
AP.EOL();
-
+
AP.SwitchToDataSection(TAI.getDataSection());
EmitCamlGlobal(getModule(), OS, AP, TAI, "frametable");
-
+
for (iterator FI = begin(), FE = end(); FI != FE; ++FI) {
CollectorMetadata &MD = **FI;
-
+
OS << "\t" << TAI.getCommentString() << " live roots for "
<< MD.getFunction().getNameStart() << "\n";
-
+
for (CollectorMetadata::iterator PI = MD.begin(),
PE = MD.end(); PI != PE; ++PI) {
-
+
uint64_t FrameSize = MD.getFrameSize();
if (FrameSize >= 1<<16) {
cerr << "Function '" << MD.getFunction().getNameStart()
@@ -121,7 +127,7 @@ void OcamlGCMetadataPrinter::finishAssembly(std::ostream &OS, AsmPrinter &AP,
<< "Frame size " << FrameSize << " >= 65536.\n";
abort(); // Very rude!
}
-
+
size_t LiveCount = MD.live_size(PI);
if (LiveCount >= 1<<16) {
cerr << "Function '" << MD.getFunction().getNameStart()
@@ -129,28 +135,28 @@ void OcamlGCMetadataPrinter::finishAssembly(std::ostream &OS, AsmPrinter &AP,
<< "Live root count " << LiveCount << " >= 65536.\n";
abort(); // Very rude!
}
-
+
OS << AddressDirective
<< TAI.getPrivateGlobalPrefix() << "label" << PI->Num;
AP.EOL("call return address");
-
+
AP.EmitInt16(FrameSize);
AP.EOL("stack frame size");
-
+
AP.EmitInt16(LiveCount);
AP.EOL("live root count");
-
+
for (CollectorMetadata::live_iterator LI = MD.live_begin(PI),
LE = MD.live_end(PI);
LI != LE; ++LI) {
assert(LI->StackOffset < 1<<16 &&
"GC root stack offset is outside of fixed stack frame and out "
"of range for Ocaml collector!");
-
+
OS << "\t.word\t" << LI->StackOffset;
AP.EOL("stack offset");
}
-
+
AP.EmitAlignment(AddressAlignLog);
}
}
OpenPOWER on IntegriCloud