Skip to content

Commit 999b216

Browse files
committed
Revert "[flang] add option to generate runtime type info as external (llvm#146071)"
breaks Compile Fails -------------------- flang-364228-0: Make Failed flang-364228-1: Make Failed target-cray-pointer: Make Failed This reverts commit faefe7c.
1 parent 05cc70f commit 999b216

File tree

18 files changed

+114
-272
lines changed

18 files changed

+114
-272
lines changed

flang/include/flang/Evaluate/tools.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1585,7 +1585,6 @@ bool IsExtensibleType(const DerivedTypeSpec *);
15851585
bool IsSequenceOrBindCType(const DerivedTypeSpec *);
15861586
bool IsBuiltinDerivedType(const DerivedTypeSpec *derived, const char *name);
15871587
bool IsBuiltinCPtr(const Symbol &);
1588-
bool IsFromBuiltinModule(const Symbol &);
15891588
bool IsEventType(const DerivedTypeSpec *);
15901589
bool IsLockType(const DerivedTypeSpec *);
15911590
bool IsNotifyType(const DerivedTypeSpec *);

flang/include/flang/Lower/LoweringOptions.def

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,5 @@ ENUM_LOWERINGOPT(RepackArraysWhole, unsigned, 1, 0)
6666
/// If true, CUDA Fortran runtime check is inserted.
6767
ENUM_LOWERINGOPT(CUDARuntimeCheck, unsigned, 1, 0)
6868

69-
/// If true, do not generate definition for runtime type info global objects of
70-
/// derived types defined in other compilation units.
71-
ENUM_LOWERINGOPT(SkipExternalRttiDefinition, unsigned, 1, 0)
72-
7369
#undef LOWERINGOPT
7470
#undef ENUM_LOWERINGOPT

flang/include/flang/Optimizer/CodeGen/CodeGen.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@ struct FIRToLLVMPassOptions {
3939
// that such programs would crash at runtime if the derived type descriptors
4040
// are required by the runtime, so this is only an option to help debugging.
4141
bool ignoreMissingTypeDescriptors = false;
42-
// Similar to ignoreMissingTypeDescriptors, but generate external declaration
43-
// for the missing type descriptor globals instead.
44-
bool skipExternalRttiDefinition = false;
4542

4643
// Generate TBAA information for FIR types and memory accessing operations.
4744
bool applyTBAA = false;

flang/include/flang/Optimizer/Passes/CommandLineOpts.h

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,6 @@ extern llvm::cl::opt<std::size_t> arrayStackAllocationThreshold;
3232
/// generated by the frontend.
3333
extern llvm::cl::opt<bool> ignoreMissingTypeDescriptors;
3434

35-
/// Shared option in tools to only generate rtti static object definitions for
36-
/// derived types defined in the current compilation unit. Derived type
37-
/// descriptor object for types defined in other objects will only be declared
38-
/// as external. This also changes the linkage of rtti objects defined in the
39-
/// current compilation unit from linkonce_odr to external so that unused rtti
40-
/// objects are retained and can be accessed from other compilation units. This
41-
/// is an experimental option to explore compilation speed improvements and is
42-
/// an ABI breaking change because of the linkage change.
43-
/// It will also require linking against module file objects of modules defining
44-
/// only types (even for trivial types without type bound procedures, which
45-
/// differs from most compilers).
46-
extern llvm::cl::opt<bool> skipExternalRttiDefinition;
47-
4835
/// Default optimization level used to create Flang pass pipeline is O0.
4936
extern llvm::OptimizationLevel defaultOptLevel;
5037

flang/include/flang/Optimizer/Support/Utils.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,32 @@ inline std::int64_t toInt(mlir::arith::ConstantOp cop) {
3535
.getSExtValue();
3636
}
3737

38+
// Reconstruct binding tables for dynamic dispatch.
39+
using BindingTable = llvm::DenseMap<llvm::StringRef, unsigned>;
40+
using BindingTables = llvm::DenseMap<llvm::StringRef, BindingTable>;
41+
42+
inline void buildBindingTables(BindingTables &bindingTables,
43+
mlir::ModuleOp mod) {
44+
45+
// The binding tables are defined in FIR after lowering inside fir.type_info
46+
// operations. Go through each binding tables and store the procedure name and
47+
// binding index for later use by the fir.dispatch conversion pattern.
48+
for (auto typeInfo : mod.getOps<fir::TypeInfoOp>()) {
49+
unsigned bindingIdx = 0;
50+
BindingTable bindings;
51+
if (typeInfo.getDispatchTable().empty()) {
52+
bindingTables[typeInfo.getSymName()] = bindings;
53+
continue;
54+
}
55+
for (auto dtEntry :
56+
typeInfo.getDispatchTable().front().getOps<fir::DTEntryOp>()) {
57+
bindings[dtEntry.getMethod()] = bindingIdx;
58+
++bindingIdx;
59+
}
60+
bindingTables[typeInfo.getSymName()] = bindings;
61+
}
62+
}
63+
3864
// Translate front-end KINDs for use in the IR and code gen.
3965
inline std::vector<fir::KindTy>
4066
fromDefaultKinds(const Fortran::common::IntrinsicTypeDefaultKinds &defKinds) {

flang/include/flang/Semantics/runtime-type-info.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@ RuntimeDerivedTypeTables BuildRuntimeDerivedTypeTables(SemanticsContext &);
3838
/// to describe other derived types at runtime in flang descriptor.
3939
constexpr char typeInfoBuiltinModule[]{"__fortran_type_info"};
4040

41-
/// Name of the builtin derived type in __fortran_type_inf that is used for
42-
/// derived type descriptors.
43-
constexpr char typeDescriptorTypeName[]{"derivedtype"};
44-
4541
/// Name of the bindings descriptor component in the DerivedType type of the
4642
/// __Fortran_type_info module
4743
constexpr char bindingDescCompName[]{"binding"};

flang/lib/Evaluate/tools.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2334,11 +2334,6 @@ bool IsBuiltinCPtr(const Symbol &symbol) {
23342334
return false;
23352335
}
23362336

2337-
bool IsFromBuiltinModule(const Symbol &symbol) {
2338-
const Scope &scope{symbol.GetUltimate().owner()};
2339-
return IsSameModule(&scope, scope.context().GetBuiltinsScope());
2340-
}
2341-
23422337
bool IsIsoCType(const DerivedTypeSpec *derived) {
23432338
return IsBuiltinDerivedType(derived, "c_ptr") ||
23442339
IsBuiltinDerivedType(derived, "c_funptr");

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include "flang/Frontend/CodeGenOptions.h"
1515
#include "flang/Frontend/PreprocessorOptions.h"
1616
#include "flang/Frontend/TargetOptions.h"
17-
#include "flang/Optimizer/Passes/CommandLineOpts.h"
1817
#include "flang/Semantics/semantics.h"
1918
#include "flang/Support/Fortran-features.h"
2019
#include "flang/Support/OpenMP-features.h"
@@ -1808,7 +1807,6 @@ void CompilerInvocation::setLoweringOptions() {
18081807
// Lower TRANSPOSE as a runtime call under -O0.
18091808
loweringOpts.setOptimizeTranspose(codegenOpts.OptimizationLevel > 0);
18101809
loweringOpts.setUnderscoring(codegenOpts.Underscoring);
1811-
loweringOpts.setSkipExternalRttiDefinition(skipExternalRttiDefinition);
18121810

18131811
const Fortran::common::LangOptions &langOptions = getLangOpts();
18141812
loweringOpts.setIntegerWrapAround(langOptions.getSignedOverflowBehavior() ==

flang/lib/Lower/Bridge.cpp

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,6 @@ class TypeInfoConverter {
263263
}
264264

265265
void createTypeInfo(Fortran::lower::AbstractConverter &converter) {
266-
createTypeInfoForTypeDescriptorBuiltinType(converter);
267266
while (!registeredTypeInfoA.empty()) {
268267
currentTypeInfoStack = &registeredTypeInfoB;
269268
for (const TypeInfo &info : registeredTypeInfoA)
@@ -279,22 +278,10 @@ class TypeInfoConverter {
279278
private:
280279
void createTypeInfoOpAndGlobal(Fortran::lower::AbstractConverter &converter,
281280
const TypeInfo &info) {
282-
if (!converter.getLoweringOptions().getSkipExternalRttiDefinition())
283-
Fortran::lower::createRuntimeTypeInfoGlobal(converter, info.symbol.get());
281+
Fortran::lower::createRuntimeTypeInfoGlobal(converter, info.symbol.get());
284282
createTypeInfoOp(converter, info);
285283
}
286284

287-
void createTypeInfoForTypeDescriptorBuiltinType(
288-
Fortran::lower::AbstractConverter &converter) {
289-
if (registeredTypeInfoA.empty())
290-
return;
291-
auto builtinTypeInfoType = llvm::cast<fir::RecordType>(
292-
converter.genType(registeredTypeInfoA[0].symbol.get()));
293-
converter.getFirOpBuilder().createTypeInfoOp(
294-
registeredTypeInfoA[0].loc, builtinTypeInfoType,
295-
/*parentType=*/fir::RecordType{});
296-
}
297-
298285
void createTypeInfoOp(Fortran::lower::AbstractConverter &converter,
299286
const TypeInfo &info) {
300287
fir::RecordType parentType{};

flang/lib/Lower/ConvertVariable.cpp

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -647,19 +647,13 @@ fir::GlobalOp Fortran::lower::defineGlobal(
647647

648648
/// Return linkage attribute for \p var.
649649
static mlir::StringAttr
650-
getLinkageAttribute(Fortran::lower::AbstractConverter &converter,
650+
getLinkageAttribute(fir::FirOpBuilder &builder,
651651
const Fortran::lower::pft::Variable &var) {
652-
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
653652
// Runtime type info for a same derived type is identical in each compilation
654653
// unit. It desired to avoid having to link against module that only define a
655654
// type. Therefore the runtime type info is generated everywhere it is needed
656-
// with `linkonce_odr` LLVM linkage (unless the skipExternalRttiDefinition
657-
// option is set, in which case one will need to link against objects of
658-
// modules defining types). Builtin objects rtti is always generated because
659-
// the builtin module is currently not compiled or part of the runtime.
660-
if (var.isRuntimeTypeInfoData() &&
661-
(!converter.getLoweringOptions().getSkipExternalRttiDefinition() ||
662-
Fortran::semantics::IsFromBuiltinModule(var.getSymbol())))
655+
// with `linkonce_odr` LLVM linkage.
656+
if (var.isRuntimeTypeInfoData())
663657
return builder.createLinkOnceODRLinkage();
664658
if (var.isModuleOrSubmoduleVariable())
665659
return {}; // external linkage
@@ -679,7 +673,7 @@ static void instantiateGlobal(Fortran::lower::AbstractConverter &converter,
679673
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
680674
std::string globalName = converter.mangleName(sym);
681675
mlir::Location loc = genLocation(converter, sym);
682-
mlir::StringAttr linkage = getLinkageAttribute(converter, var);
676+
mlir::StringAttr linkage = getLinkageAttribute(builder, var);
683677
fir::GlobalOp global;
684678
if (var.isModuleOrSubmoduleVariable()) {
685679
// A non-intrinsic module global is defined when lowering the module.
@@ -1271,7 +1265,7 @@ instantiateAggregateStore(Fortran::lower::AbstractConverter &converter,
12711265
if (var.isGlobal()) {
12721266
fir::GlobalOp global;
12731267
auto &aggregate = var.getAggregateStore();
1274-
mlir::StringAttr linkage = getLinkageAttribute(converter, var);
1268+
mlir::StringAttr linkage = getLinkageAttribute(builder, var);
12751269
if (var.isModuleOrSubmoduleVariable()) {
12761270
// A module global was or will be defined when lowering the module. Emit
12771271
// only a declaration if the global does not exist at that point.
@@ -2476,7 +2470,8 @@ void Fortran::lower::defineModuleVariable(
24762470
AbstractConverter &converter, const Fortran::lower::pft::Variable &var) {
24772471
// Use empty linkage for module variables, which makes them available
24782472
// for use in another unit.
2479-
mlir::StringAttr linkage = getLinkageAttribute(converter, var);
2473+
mlir::StringAttr linkage =
2474+
getLinkageAttribute(converter.getFirOpBuilder(), var);
24802475
if (!var.isGlobal())
24812476
fir::emitFatalError(converter.getCurrentLocation(),
24822477
"attempting to lower module variable as local");
@@ -2611,9 +2606,10 @@ void Fortran::lower::createIntrinsicModuleGlobal(
26112606
void Fortran::lower::createRuntimeTypeInfoGlobal(
26122607
Fortran::lower::AbstractConverter &converter,
26132608
const Fortran::semantics::Symbol &typeInfoSym) {
2609+
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
26142610
std::string globalName = converter.mangleName(typeInfoSym);
26152611
auto var = Fortran::lower::pft::Variable(typeInfoSym, /*global=*/true);
2616-
mlir::StringAttr linkage = getLinkageAttribute(converter, var);
2612+
mlir::StringAttr linkage = getLinkageAttribute(builder, var);
26172613
defineGlobal(converter, var, globalName, linkage);
26182614
}
26192615

0 commit comments

Comments
 (0)