Option *OptTable::CreateOption(unsigned id) const { const Info &info = getInfo(id); const OptionGroup *Group = cast_or_null<OptionGroup>(getOption(info.GroupID)); const Option *Alias = getOption(info.AliasID); Option *Opt = 0; switch (info.Kind) { case Option::InputClass: Opt = new InputOption(id); break; case Option::UnknownClass: Opt = new UnknownOption(id); break; case Option::GroupClass: Opt = new OptionGroup(id, info.Name, Group); break; case Option::FlagClass: Opt = new FlagOption(id, info.Name, Group, Alias); break; case Option::JoinedClass: Opt = new JoinedOption(id, info.Name, Group, Alias); break; case Option::SeparateClass: Opt = new SeparateOption(id, info.Name, Group, Alias); break; case Option::CommaJoinedClass: Opt = new CommaJoinedOption(id, info.Name, Group, Alias); break; case Option::MultiArgClass: Opt = new MultiArgOption(id, info.Name, Group, Alias, info.Param); break; case Option::JoinedOrSeparateClass: Opt = new JoinedOrSeparateOption(id, info.Name, Group, Alias); break; case Option::JoinedAndSeparateClass: Opt = new JoinedAndSeparateOption(id, info.Name, Group, Alias); break; } if (info.Flags & DriverOption) Opt->setDriverOption(true); if (info.Flags & LinkerInput) Opt->setLinkerInput(true); if (info.Flags & NoArgumentUnused) Opt->setNoArgumentUnused(true); if (info.Flags & NoForward) Opt->setNoForward(true); if (info.Flags & RenderAsInput) Opt->setNoOptAsInput(true); if (info.Flags & RenderJoined) { assert((info.Kind == Option::JoinedOrSeparateClass || info.Kind == Option::SeparateClass) && "Invalid option."); Opt->setRenderStyle(Option::RenderJoinedStyle); } if (info.Flags & RenderSeparate) { assert((info.Kind == Option::JoinedOrSeparateClass || info.Kind == Option::JoinedClass) && "Invalid option."); Opt->setRenderStyle(Option::RenderSeparateStyle); } if (info.Flags & Unsupported) Opt->setUnsupported(true); if (info.Flags & CC1Option) Opt->setIsCC1Option(true); return Opt; }
Option *OptTable::constructOption(options::ID id) const { Info &info = getInfo(id); const OptionGroup *Group = cast_or_null<OptionGroup>(getOption((options::ID) info.GroupID)); const Option *Alias = getOption((options::ID) info.AliasID); Option *Opt = 0; switch (info.Kind) { case Option::InputClass: Opt = new InputOption(); break; case Option::UnknownClass: Opt = new UnknownOption(); break; case Option::GroupClass: Opt = new OptionGroup(id, info.Name, Group); break; case Option::FlagClass: Opt = new FlagOption(id, info.Name, Group, Alias); break; case Option::JoinedClass: Opt = new JoinedOption(id, info.Name, Group, Alias); break; case Option::SeparateClass: Opt = new SeparateOption(id, info.Name, Group, Alias); break; case Option::CommaJoinedClass: Opt = new CommaJoinedOption(id, info.Name, Group, Alias); break; case Option::MultiArgClass: Opt = new MultiArgOption(id, info.Name, Group, Alias, info.Param); break; case Option::JoinedOrSeparateClass: Opt = new JoinedOrSeparateOption(id, info.Name, Group, Alias); break; case Option::JoinedAndSeparateClass: Opt = new JoinedAndSeparateOption(id, info.Name, Group, Alias); break; } for (const char *s = info.Flags; *s; ++s) { switch (*s) { default: assert(0 && "Invalid option flag."); case 'J': assert(info.Kind == Option::SeparateClass && "Invalid option."); Opt->setForceJoinedRender(true); break; case 'S': assert(info.Kind == Option::JoinedClass && "Invalid option."); Opt->setForceSeparateRender(true); break; case 'd': Opt->setDriverOption(true); break; case 'i': Opt->setNoOptAsInput(true); break; case 'l': Opt->setLinkerInput(true); break; case 'q': Opt->setNoArgumentUnused(true); break; case 'u': Opt->setUnsupported(true); break; } } return Opt; }