aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-02-15 22:36:15 +0000
committerBill Wendling <isanbard@gmail.com>2012-02-15 22:36:15 +0000
commit734909a078edcadf23fe1c8125b1b1749ec7a908 (patch)
tree134fb4620bfa74423406b8564500224e78768a69 /llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
parent0294932a43109d91d650332ff178e49803c66e6c (diff)
downloadllvm-734909a078edcadf23fe1c8125b1b1749ec7a908.zip
llvm-734909a078edcadf23fe1c8125b1b1749ec7a908.tar.gz
llvm-734909a078edcadf23fe1c8125b1b1749ec7a908.tar.bz2
Modify the code that emits the module flags to use the new module flags accessor
method. This allows the target lowering code to not have to deal with MDNodes. Also, avoid leaking memory like a sieve by not creating a global variable for the image info section, but just emitting the code directly. llvm-svn: 150624
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
-rw-r--r--llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp70
1 files changed, 34 insertions, 36 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index 1b62419..90487d9 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -374,57 +374,55 @@ TargetLoweringObjectFileELF::getStaticDtorSection(unsigned Priority) const {
/// emitModuleFlags - Emit the module flags that specify the garbage collection
/// information.
void TargetLoweringObjectFileMachO::
-emitModuleFlags(MCStreamer &Streamer, NamedMDNode *ModFlags,
+emitModuleFlags(MCStreamer &Streamer,
+ ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
Mangler *Mang, const TargetMachine &TM) const {
- StringRef Version("Objective-C Image Info Version");
- StringRef SectionSpec("Objective-C Image Info Section");
- StringRef GC("Objective-C Garbage Collection");
- StringRef GCOnly("Objective-C GC Only");
-
unsigned VersionVal = 0;
unsigned GCFlags = 0;
- StringRef Section;
+ StringRef SectionVal;
- for (unsigned i = 0, e = ModFlags->getNumOperands(); i != e; ++i) {
- MDNode *Flag = ModFlags->getOperand(i);
- Value *Behavior = Flag->getOperand(0);
+ for (ArrayRef<Module::ModuleFlagEntry>::iterator
+ i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) {
+ const Module::ModuleFlagEntry &MFE = *i;
// Ignore flags with 'Require' behavior.
- if (cast<ConstantInt>(Behavior)->getZExtValue() == Module::Require)
+ if (MFE.Behavior == Module::Require)
continue;
- Value *Key = Flag->getOperand(1);
- Value *Val = Flag->getOperand(2);
-
- StringRef KeyStr = cast<MDString>(Key)->getString();
+ StringRef Key = MFE.Key->getString();
+ Value *Val = MFE.Val;
- if (KeyStr == Version)
+ if (Key == "Objective-C Image Info Version")
VersionVal = cast<ConstantInt>(Val)->getZExtValue();
- else if (KeyStr == GC || KeyStr == GCOnly)
+ else if (Key == "Objective-C Garbage Collection" ||
+ Key == "Objective-C GC Only")
GCFlags |= cast<ConstantInt>(Val)->getZExtValue();
- else if (KeyStr == SectionSpec)
- Section = cast<MDString>(Val)->getString();
+ else if (Key == "Objective-C Image Info Section")
+ SectionVal = cast<MDString>(Val)->getString();
}
- // The section is mandatory. If we don't have it, then we don't have image
- // info information.
- if (Section.empty()) return;
-
- uint32_t Values[2] = { VersionVal, GCFlags };
- Module *M = ModFlags->getParent();
- Constant *Init = ConstantDataArray::get(M->getContext(), Values);
- GlobalVariable *GV = new GlobalVariable(*M, Init->getType(), false,
- GlobalValue::InternalLinkage, Init,
- "\01L_OBJC_IMAGE_INFO");
- GV->setSection(Section);
-
- MCSymbol *GVSym = Mang->getSymbol(GV);
- SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
- const MCSection *TheSection = SectionForGlobal(GV, GVKind, Mang, TM);
+ // The section is mandatory. If we don't have it, then we don't have GC info.
+ if (SectionVal.empty()) return;
- Streamer.SwitchSection(TheSection);
- Streamer.EmitLabel(GVSym);
+ StringRef Segment, Section;
+ unsigned TAA = 0, StubSize = 0;
+ bool TAAParsed;
+ std::string ErrorCode =
+ MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section,
+ TAA, TAAParsed, StubSize);
+ if (!ErrorCode.empty()) {
+ // If invalid, report the error with report_fatal_error.
+ report_fatal_error("Invalid section specifier '" +
+ Section + "': " + ErrorCode + ".");
+ }
+ // Get the section.
+ const MCSectionMachO *S =
+ getContext().getMachOSection(Segment, Section, TAA, StubSize,
+ SectionKind::getDataRel());
+ Streamer.SwitchSection(S);
+ Streamer.EmitLabel(getContext().
+ GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
Streamer.EmitIntValue(VersionVal, 4);
Streamer.EmitIntValue(GCFlags, 4);
Streamer.AddBlankLine();