How to set constant pool section?

Hi,

In the document: http://llvm.org/docs/WritingAnLLVMBackend.html
described example like:

SparcTargetAsmInfo::SparcTargetAsmInfo(const SparcTargetMachine &TM) {
  Data16bitsDirective = "\t.half\t";
  Data32bitsDirective = "\t.word\t";
  Data64bitsDirective = 0; // .xword is only supported by V9.
  ZeroDirective = "\t.skip\t";
  CommentString = "!";
  ConstantPoolSection = "\t.section \".rodata\",#alloc\n";
}

That is wrong for LLVM 3.0

In latest LLVM versions, Sparc have MC subtarget and:

SparcELFMCAsmInfo::SparcELFMCAsmInfo(const Target &T, StringRef TT) {
  IsLittleEndian = false;
  Triple TheTriple(TT);
  if (TheTriple.getArch() == Triple::sparcv9)
    PointerSize = 8;

  Data16bitsDirective = "\t.half\t";
  Data32bitsDirective = "\t.word\t";
  Data64bitsDirective = 0; // .xword is only supported by V9.
  ZeroDirective = "\t.skip\t";
  CommentString = "!";
  HasLEB128 = true;
  SupportsDebugInformation = true;

  SunStyleELFSectionSwitchSyntax = true;
  UsesELFSectionDirectiveForBSS = true;

  WeakRefDirective = "\t.weak\t";

  PrivateGlobalPrefix = ".L";
}

But I can not find in Sparc, or any other backend code to set
ConstantPoolSection.

I tried in my backend deriving MCAsmInfo, but it seems, that
ConstantPoolSection is not member of MCAsmInfo.

I really need in my backend value for this section, distinct from
default. Where can I set it?

Thanks in advance for all suggestions.

Hello

I really need in my backend value for this section, distinct from
default. Where can I set it?

It was renamed to ReadOnlySection. You might want to check the logic
inside CodeGen/TargetLoweringObjectFileImp.cpp (in particular -
TargetLoweringObjectFile::SelectionSectionForGlobal) to see how it's
used.

Hi,

Thanks for pointing direction. As far, as I understand by reversing,
logic, that I want to overwrite is digged into:

lib/MC/MCSectionELF.cpp

MCSectionELF::PrintSwitchToSection

  if (ShouldOmitSectionDirective(SectionName, MAI)) {
    OS << '\t' << getSectionName() << '\n';
    return;
  }

// otherwise print ".section" directive and then section name

So I need to overwrite ShouldOmitSectionDirective behavior. But this
method of MCSectionELF is not virtual.
As a workaround, I stubbed it in core LLVM code
(MCSectionELF::ShouldOmitSectionDirective), and everything works, but
it is ugly. May be you can advise further?

I think you are off the mark here. The fragment above is used to create

  .text

instead of

  .section ".text"

or other more ugly forms. This is really just an optimisation for
readiblity and compatibility with ancient tools.

Joerg

Hi,

What I want is to emit exact custom string to switch to rodata,
without ".section" in the front of it. I can see only that place where
".section" directive is hardcoded. It is relatively new hardcode --
earlier versions had string ConstantPoolSection to operate with.

Hello

So I need to overwrite ShouldOmitSectionDirective behavior. But this
method of MCSectionELF is not virtual.
As a workaround, I stubbed it in core LLVM code
(MCSectionELF::ShouldOmitSectionDirective), and everything works, but
it is ugly. May be you can advise further?

So, it seems that:

1. You're using ELF for your target
2. The assember you're using despite pretending to be ELF-ish is so
broken, that it requires something like ".foo" instead of ".section
.foo" ?

Is it so?