[PATCH] D40567: Always show template parameters in IR type names
Serge Pavlov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 4 09:16:25 PST 2017
sepavloff added a comment.
Consider a bit more complicated example.
File `common.h`
#ifndef COMMON_H
#define COMMON_H
struct Alarm { };
struct Info { };
template<typename T> struct Handler;
#endif
File `use-1.cpp`
#include "common.h"
Handler<Info> *info;
void set(Handler<Info> *e) { info = e; }
File `use-2.cpp`
#include "common.h"
Handler<Alarm> *alarm;
void set(Handler<Alarm> *e) { alarm = e; }
File `defs.h`
#ifndef DEFS_H
#define DEFS_H
template<> struct Handler<Info> { int val; };
template<> struct Handler<Alarm> { char val; };
void set(Handler<Info> *);
void set(Handler<Alarm> *);
#endif
File `main.cpp`
#include "common.h"
#include "defs.h"
void init() {
Handler<Info> i;
set(&i);
Handler<Alarm> a;
set(&a);
}
Process these files with commands:
clang -c -emit-llvm use-1.cpp -o use-1.cpp.bc
clang -c -emit-llvm use-2.cpp -o use-2.cpp.bc
clang -c -emit-llvm main.cpp -o main.cpp.bc
llvm-link use-1.cpp.bc use-2.cpp.bc main.cpp.bc -S -o test.ll
The resulting IR file has deficiencies:
- The types of the global variables `info` and `alarm` are the same:
%struct.Event = type { i32 }
%struct.Event.0 = type { i8 }
@info = global %struct.Event* null, align 8
@alarm = global %struct.Event* null, align 8
- The signatures of the `set` functions are the same:
define void @_Z4fireP5EventI4InfoE(%struct.Event* %e) #0 {
…
}
define void @_Z4fireP5EventI5AlarmE(%struct.Event* %e) #0 {
…
}
- The call to `set(Handler<Alarm> *)` is augmented by a bitcast to 'fix' its type:
define void @_Z4fireP5EventI5AlarmE(%struct.Event* %e) #0 {
…
call void bitcast (void (%struct.Event*)* @_Z4fireP5EventI5AlarmE to void (%struct.Event.0*)*)(%struct.Event.0* %a)
…
}
The IR created by `llvm-link` is distorted. Although code generation (in LTO compilation) might be unaffected by this distortions, other applications of IR linking suffer from it. It does not allow to implement some checks, validation techniques and optimizations.
https://reviews.llvm.org/D40567
More information about the cfe-commits
mailing list