Skip to content

Commit

Permalink
Don't force relaxation of AdvanceLoc instructions on OS X. gdb is hap…
Browse files Browse the repository at this point in the history
…py with

the smaller encoding and this cuts 270336 bytes from a release version of
clang and 1246272 bytes from a debug build.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131067 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
espindola committed May 8, 2011
1 parent 6a61834 commit 4eafe10
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 15 deletions.
3 changes: 1 addition & 2 deletions include/llvm/MC/MCDwarf.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,7 @@ namespace llvm {
//
static void Emit(MCStreamer &streamer, bool usingCFI);
static void EmitAdvanceLoc(MCStreamer &Streamer, uint64_t AddrDelta);
static void EncodeAdvanceLoc(uint64_t AddrDelta, raw_ostream &OS,
const TargetAsmInfo &AsmInfo);
static void EncodeAdvanceLoc(uint64_t AddrDelta, raw_ostream &OS);
};
} // end namespace llvm

Expand Down
3 changes: 1 addition & 2 deletions lib/MC/MCAssembler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -759,8 +759,7 @@ bool MCAssembler::RelaxDwarfCallFrameFragment(MCAsmLayout &Layout,
SmallString<8> &Data = DF.getContents();
Data.clear();
raw_svector_ostream OSE(Data);
const TargetAsmInfo &AsmInfo = getContext().getTargetAsmInfo();
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OSE, AsmInfo);
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OSE);
OSE.flush();
return OldSize != Data.size();
}
Expand Down
16 changes: 5 additions & 11 deletions lib/MC/MCDwarf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -868,27 +868,21 @@ void MCDwarfFrameEmitter::EmitAdvanceLoc(MCStreamer &Streamer,
SmallString<256> Tmp;
raw_svector_ostream OS(Tmp);
const TargetAsmInfo &AsmInfo = Streamer.getContext().getTargetAsmInfo();
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OS, AsmInfo);
MCDwarfFrameEmitter::EncodeAdvanceLoc(AddrDelta, OS);
Streamer.EmitBytes(OS.str(), /*AddrSpace=*/0);
}

void MCDwarfFrameEmitter::EncodeAdvanceLoc(uint64_t AddrDelta,
raw_ostream &OS,
const TargetAsmInfo &AsmInfo) {
// This is a small hack to facilitate the transition to CFI on OS X. It
// relaxes all address advances which lets us produces identical output
// to the one produce by CodeGen.
const bool Relax = !AsmInfo.isFunctionEHFrameSymbolPrivate();

raw_ostream &OS) {
// FIXME: Assumes the code alignment factor is 1.
if (AddrDelta == 0) {
} else if (isUIntN(6, AddrDelta) && !Relax) {
} else if (isUIntN(6, AddrDelta)) {
uint8_t Opcode = dwarf::DW_CFA_advance_loc | AddrDelta;
OS << Opcode;
} else if (isUInt<8>(AddrDelta) && !Relax) {
} else if (isUInt<8>(AddrDelta)) {
OS << uint8_t(dwarf::DW_CFA_advance_loc1);
OS << uint8_t(AddrDelta);
} else if (isUInt<16>(AddrDelta) && !Relax) {
} else if (isUInt<16>(AddrDelta)) {
// FIXME: check what is the correct behavior on a big endian machine.
OS << uint8_t(dwarf::DW_CFA_advance_loc2);
OS << uint8_t( AddrDelta & 0xff);
Expand Down

0 comments on commit 4eafe10

Please sign in to comment.